为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,我们也未必全部数据都发送给对方了,所以我们不可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,我们的ACK和FIN一般都会分开发送。
为什么要time_wait等待2msl?
MSL是TCP报文段在网络中的最大生存时间。
TIME_WAIT状态存在的原因有两点:(time_wait状态就是四次挥手中的状态)
- 可靠的终止TCP连接。
这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用。 - 保证让迟来的TCP报文有足够的时间被识别并丢弃。
每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。
tcp如何保证可靠性?
TCP协议可靠使用以下机制来保证
1、ack确认机制:
- TCP报文段首部sequence字段唯一标识TCP报文段,也作为顺序的标识
- TCP通信采用ACK+确认号的确认机制
- TCP报文首部的checksum字段记录报文段数据的checksum
2、重发机制
当没有收到ack的确认码时会重新发送
3、TCP协议的优化-滑动窗口机制
停止等待协议:发送窗口=接受窗口=1
回退N部协议:发送窗口大于1,接受窗口=1,发送失败后的全部报文
选择重复协议:发送窗口大于1,接受窗口大于1,仅重复失败的报文
滑动窗口相关的有流量控制,根据网络情况决定
拥塞控制,一开始不知道网络情况,缓慢发送数据,慢慢调整窗口大小,后续根据网络情况调整窗口大小