2.2 总图
各种协议说明:
- IPv4:网际协议版本4,给TCP、UDP、SCTP、ICMP和IGMP提供分组递送服务
- IPv6:网际协议版本6,给TCP、UDP、SCTP和ICMv6提供分组递送服务
- TCP:传输控制协议
- UDP:用户数据报协议
- SCTP:流控制传输协议,提供可靠全双工关联的面向连接的协议
- ICMP:网际控制消息协议,处理在路由器和主机之间流通的错误和控制消息。
- IGMP:网际组管理协议,用于多播
- ARP:地址解析协议,把一个IPv4地址映射成一个硬件地址
- RARP:反向地址解析协议,把一个硬件地址映射成一个IPv4地址
- ICMPv6:网际控制消息协议版本6,综合了ICMPv4、IGMP和ARP的功能
- BPF:BSD分组过滤器。提供对于数据链路层的访问能力
- DLPI:数据链路提供者接口
2.3 用户数据报协议(UDP)
应用进程往一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,UDP数据报进而被封装到一个IP数据报,然后发送到目的地。
不保证:数据报最终会到达目的地、各个数据报的先后顺序跨网络后保持不变‘、每个数据报只到达一次。
每个UDP数据报都有一个长度,如果一个数据报正确地到达其目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。
UDP提供无连接服务,客户与服务器之间不必存在任何长期关系。
2.4 传输控制协议(TCP)
TCP提供客户与服务器之间的连接,提供可靠性,向另一端发送数据时,要求对端返回一个确认,如果没有收到确认,TCP自动重传数据并等待更长时间。数次重传失败后放弃。
TCP含有用于动态估算客户和服务器之间的往返时间(RTT)的算法,以便知道等待一个确认需要多少时间。
TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。
TCP提供流量控制。TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,称为通告窗口。任何时刻,该窗口指出接收缓冲区中当前可用的空间量。
TCP连接是全双工的,意味着在一个给定的连接上应用可以在任何时刻进出两个方向上既发送数据又接收数据。
2.5 流控制传输协议(SCTP)
SCTP在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。
SCTP是面向消息的。它提供各个记录的按序递送服务,与UDP一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。
SCTP能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。
SCTP提供多宿特性,使得单个SCTP端点能够支持多个IP地址。
2.6 TCP连接的建立和终止
2.6.1 三路握手
建立一个TCP连接时会发生下述情形:
- 服务器必须准备好接收外来的连接。这通常通过调用socket、bind和listen3个函数完成,称为被动打开。
- 客户通过connect发起主动打开。导致客户TCP发送一个SYN(同步)分组,告诉服务器客户将在连接中发送的数据的初始序列号。
- 服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分组,其含有服务器将在同一连接中发送的数据的初始序列号。服务器在一个分组中发送SYN和对客户SYN的ACK。
- 客户必须确认服务器的SYN。
上图给出客户的初始序列号为J,服务器的初始序列号为K。ACK中的确认号是发送这个ACK的一端所期待的下一个序列号。每个SYN的ACK中的确认号就是该SYN的初始序列号加1。
2.6.2 TCP选项
每一个SYN可以含有多个TCP选项,下面是常用的TCP选项:
- MSS选项。发送SYN的TCP一段使用本选项通告对端它的最大分组大小,即MSS,也就是它在本连接的每个TCP分组中愿意接受的最大数据量。发送端TCP使用接收端的MSS值作为所发送分组的最大大小。
- 窗口规模选项。TCP连接任何一端能够通告对端的最大窗口大小是65536。在TCP头部中相应的字段占16位。
- 时间戳选项。
2.6.3 TCP连接终止
TCP终止需要四个分组:
- 某个应用进程首先调用close,称该端执行主动关闭。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
- 接收到这个FIN的对端执行被动关闭。这个FIN由TCP确认。它的接收也作为一个文件结束符传递给接收端应用进程,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
- 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
- 接收这个最终FIN的原发送端TCP(执行主动关闭的那端)确认这个FIN。
上图展示了客户端执行主动关闭的情形,实际上任何一端都可以执行主动关闭,通常是客户执行主动关闭。
2.6.4 TCP状态转换图
具体实例间下图:
2.7 TIME_WAIT状态
端点停留在这个状态的持续时间是最长分组生命MSL的两倍。
MSL是任何IP数据报能够在因特网中存活的最长时间。
TIME_WAIT状态由两个存在的理由:
- 可靠地实现TCP全双工连接的终止:假设最终的ACK丢失,服务器将重新发送最终的FIN,因此客户必须维护状态信息,以允许其重新发送最终那个ACK。这也解释了为什么执行主动关闭的一端是处于TIME_WAIT状态的一端。
- 允许老的重复分组在网络中消逝:如果在两个IP和对应的端口号之间关闭一个TCP连接,一段时间后重建,则后一个连接称为前一个连接的化身。TCP必须防止来自某个连接的老的重复分组在该连接已经终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。
2.9 端口号
当一个客户想要跟一个服务器联系时,它必须表示想要与之通信的这个服务器。TCP、UDP、SCTP定义了一组众所周知的端口号,用于标识众所周知的服务。
端口号被划分成以下三段:
- 众所周知的端口为0~1023。
- 已登记的端口为1024~49151
- 49152~65535是动态或私用端口,也称临时端口
套接字对
一个TCP连接的套接字对是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号。
套接字对唯一标识一个网络上的每个TCP连接。