UNIX网络编程1:传输层协议TCP、UDP、SCTP
1. OSI模型
描述网络中各个协议层通常用国际标准组织ISO的计算机通信开放系统互连(open system interconnection,OSI)模型。它与网际网协议族中的各层对应如下:
TCP和UDP之间有个间隙的原因:网络应用可以绕过传输层直接使用IPv4或者IPv6是可能的,这就是原始套接字,但很少使用。
2. TCP/IP协议概况
- IPv4
- Ipv6
- TCP:传输控制协议,面向连接,为用户提供可靠的全双工字节流。TCP套接字是一种流套接字。关心确认、超时和重传之类的细节。
- UDP:用户数据包协议,是无连接协议,UDP套接字是一种数据包套接字。可以是全双工的。
- SCTP:流控制传输协议,提供可靠全双工关联的面向连接的协议。SCTP是多宿的,每个关联的两端均涉及一组IP地址和端口号。SCTP提供消息服务。
- ICMP:网际控制消息协议,处理在路由器和主机之间流通的错误和控制消息。
- IGMP:网际组管理协议,用于多播,它在IPv4中是可选的。
- ARP:地址解析协议,用于把一个IPv4协议映射成一个硬件地址(如以太网地址)
- RARP:反向地址解析协议,用于把一个硬件地址解析成一个IPv4地址
- ICMPv6:网际控制消息协议版本6,综合了ICMPv4、IGMP、ARP的功能
- BFP:BSD分组过滤器,提供对数据链路层的访问能力
- DLPI:数据链路提供者接口,提供对数据链路层的访问能力
3. TCP建立连接和终止
3.1 三路握手
3.2 TCP选项
- MSS选项:最大分节大小,TCP_MAXSEG
- 窗口规模选项:TCP连接任何一段能够通告对端的最大窗口大小是65535(因为TCP首部中相应的字段占16位),但是为了高速网络连接和长延迟路径的尽可能大的吞吐量的需求,需要能够扩大通告窗口的大小。窗口规模选项指定TCP首部中的通告窗口必须扩大(即左移)的位数(0~14),因此所提供的最大窗口接近1GB(65535*2^14)。SO_RCVBUF
- 时间戳选项:为防止失而复现的分组可能造成的数据破坏,网络编程人员无需考虑这个选项(^ - ^)
3.3 TCP连接终止
在步骤2到步骤3之间,从被动关闭一端到主动关闭一端流动数据是可能的,这称为半关闭。
3.4 TCP状态转换图
4. TIME_WAIT状态
- 最长分节生命期MSL:任何IP数据包能够在因特网中存活的最长时间,源自Berkeley的实现采用30s,RFC 1122建议2分钟
- TIME_WAIT状态:主动关闭一端发送ACK后所处的状态,持续2MSL(即1分钟到4分钟之间)
- TIME_WAIT状态存在的理由:可靠的实现TCP全双工连接的终止(如果发送的ACK丢失,被动关闭端重传FIN,主动关闭端需要重传ACK);允许老的重复分节在网络中消逝
5. 端口号
用端口号来区分进程,端口号是十六位的整数。下图是端口号的分配图:
LANA(the Internet Assigned Numbers Authority,因特网已分配数值权威机构)维护着一个端口号分配状况清单。
套接字对:一个TCP连接的四元组,为本地IP地址,本地端口号,外地IP地址,外地端口号。
标记每个端点的两个值(IP地址和端口号)通常称为一个套接字。
6. 缓冲区大小及限制
- IPv4数据总长度最大为65535字节,IPv4首部为20字节的固定部分和40字节的可选项。IPv4要求最小链路MTU为68字节。IPv4的主机和路由器可对其产生以及转发的数据包分片,若首部DF位被设置则不可分片
- IPv6数据报净荷长度最大为65535字节,首部长度为40字节,所以总长度最大为65575字节。有特大净荷选项,可以把净荷大小字段扩展到32位,但是需要MTU支持。IPv6要求最小链路MTU为1280字节(可以运行在MTU小于1280字节的链路上,利用分片和重组)。IPv6主机和路由器只可对其产生的数据包分片。
- MTU(maximum tramission unit,最大传输单元)是数据链路对传输的数据报大小限制,以太网MTU为1500字节。
- 最小重组缓冲区大小,它是IPv4和IPv6都必须支持的最小数据报大小,对于IPv4是576字节, 对于IPv6是1500字节
- MSS(maximum segment size,最大分节大小),TCP用MSS向对端通告对端在每个分节中能发送的最大TCP数据量,MSS经常设置为MTU减去IP和TCP首部的固定长度,在以太网中使用IPv4的MSS为1460,使用IPv6的MSS为1440(两者TCP首部为20字节,但IPv4首部是20字节,IPv6首部是40字节)