1. TCP面向连接、可靠保证
1.1. 有连接的建立过程
1.2. 发送的数据需要确认,超时则需要重传
1.3. 有序列号,需要重组数据包
1.4. 流量控制,(窗口大小)
1.5. 全双工
UDP如果要可靠,则需要在应用层实现1、2、3、4的功能。
2. TCP相应的选项
2.1. 窗口大小:对应于设置的接收缓冲区大小(SO_RCVBUF)。
TCP为真正的缓冲区大小。是为了流量控制。如果对方缓冲区不够时,数据不会发送给对方,但是这时候是已经写到本地的发送缓冲区了。另外如果发送缓冲区不够时,数据写操作是不会成功(阻塞,或失败)。写成功只表示放入发送缓冲区,还没发送给对方。且如果没有确认,则不会从缓冲区删除。
UDP则没有缓冲区的概念,其缓冲区大小表示的是一次发送数据时的最大数据报长度,如果超过长度则直接报错。内核以某种形式临时保留用户要发的数据,一旦链路层发送数据后,则删除该缓冲。写成功表示加入了链路层的输出队列,如果队列不能存放该数据,则直接返回ENOBUFS(但实现一般不严格)。
2.2. MSS:TCP分节的最大数据量(TCP_MAXSEG)
一个TCP分节的最大数据量,为了减少IP层往链路层发送时减少分包。一般为MTU-40(60,IPV6)。MTU一般为1500。因此IPV4一般为1460。最大可以为65535-40(65495)。
2.3. MTU
链路层上限制的包大小。由物理线路决定的。一般为1500。
3. 时间相关的术语
3.1. RTT(round-trip time)包的一次往返时间。
3.2. MSL(maximum segment life)包的最大存活时间,为时间值。
3.3. TTL(time to live)包的存活时间。为经过的路由器跳数。
4. TCP关闭
4.1. Shutdown执行半关闭
4.2. SO_LINGER设置,影响Close行为。
4.3. TIME_WAIT状态,2MSL
主动方才会进入。
两个原因需要2MSL状态。一是TCP全双工关闭;二是允许旧的重复分节在网络中消失。
4.4. CLOSE_WAIT状态
被动关闭的一方,如果已经给对方响应了其FIN,但自己还没有关闭,则处于这个状态。