TIME_WAIT状态
tcp中主动发起断开连接的一方在发送过
FIN
之后处于TIME_WAIT
的状态,该状态的持续时间是MSL
的两倍,有时候称之为2MSL
MSL
的确定:就是分组能够在互联网中的存在的时间,主要是由跳步数TTL
进行确认的,我们假设具有最大跳步数的分组在网络中的存在时间不能 超过MSL
,可以认为MSL
略大于最大跳步数存在的时间
TIME_WAIT状态存在的两个理由
- 可靠的实现TCP全双工连接的终止
- 允许老的重复分节在网络中消逝
可靠的实现TCP终止
假设主动发起连接关闭方发送的
ACK
丢失了的话,就会触发超时重发FIN
报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL。可以保证实现TCP的可靠的终止
防止历史连接错乱的出现在新的连接中
假设主机1同主机2之间实现了tcp连接,断开连接的时候没有
time_wait
的状态的话可能出现这种情况:上一个连接中的数据包没有消失在网络中,假设两台主机用同上一次的端口进行连接(也即是四元组相同),可能就会接收到还没有消逝的上一次的残留的数据包使得这次的连接数据发生错乱。
设置了TIME_WAIT的话能够保证数据报文在下一次建立tcp连接之前全部消失在互联网中
TCP端口号与并发服务器
记住一点:服务端的端口号就代表着一种服务,一个端口号是可以同时为多个客户端进程进行连接通信的
并发服务器:当客户端发起连接的时候,服务端创建子进程同客户端进行连接,服务端的ip与端口号都是监听套接字所绑定的端口号。
TCP输出
每一个TCP套接字都是由一个发送缓冲区的,可以通过更改
SO_SNDBUF
套接字选项来更改缓冲区的大小。比如当用户进程调用
write
的时候,意义是将应用进程缓冲区的内容复制到tcp发送缓冲区中
,如果发送缓冲区不足以放下应用进程缓冲区的内容,那么write
就会发生阻塞,直到全部复制到发送缓冲区。因此,
write
函数调用成功 仅仅是数据复制到了socket缓冲区,并不代表数据被对方接收了,必须通过ACK
才能够确认被接收了本端的TCP以MSS大小或者是更小的块将数据发送给IP,同时设置TCP首部等
UDP输出
因为UDP是不可靠的,那么就不必保存应用进程数据的一个副本,无需真正的发送缓冲区,来了数据直接发送就行了
用户进程调用
write
的时候,成功返回表示所写的数据报或者所有的片段都被加入数据链路层的队列中