TCP 可靠传输:
数据编号与累积确认,确认号表示下次期望收到的数据中第一个数据字节序号,延迟确认机制,捎带确认。给每一个报文段设置定时器,超时重传。
以字节为单位的滑动窗口协议。发送窗口大小是不断变化的,初始值在建立连接时双方商定,在通信工程中,TCP 的流量控制和拥塞控制会根据情况动态调整发送窗口上限值。
TIME_WAIT 状态:
客户端在接收到服务器的FIN 消息后,发送ACK消息后,从FIN_WAIT2进入TIME_WAIT ,等待2个数据段存活时长后再进入CLOSED 状态。
为什么需要等待2个数据段最大存活时长:
1、防止延迟的数据段被其他使用相同源地址、源端口、目的地址以及目的端口的TCP 连接收到。
2、保证tcp连接的远程被正确关闭,就是等待被动关闭连接的一方收到FIN 对应的ACK 消息。
如果不等待2MSL ,直接进入closed状态,如果最后的ACK 消息丢失,那么服务端会超时重发FIN消息,直到收到确认。2MSL 也是由此而来,客户端➡服务端(1MSL ),超时重传服务端➡客户端(发送FIN ,1MSL )。
同时,如果客户端不等待2MSL ,直接进入closed状态,当客户端下次重新发送SYN 消息请求握手时,会收到服务端的RST 消息,连接建立的过程就会终止。
在高并发情况下可能会产生大量TIME_WAIT 状态的连接,可以试着配置MSL的时长。
三次握手的原因:
1、历史连接(主要原因)
如果通信次数只有两次,那么发送方一旦发出建立连接请求之后,它就没有办法撤回这一请求。在网络不好的情况下,发送方发送多次建立连接请求,那么接受方知能接受或者拒绝,接收方不知道是过期的连接请求还是新的连接请求。
如果通信次数是三次,并引入RST 这一控制消息,发送方收到接受方的ack时,判断当前连接是否为历史连接。
如果是历史连接,那么发送方就可以直接发送RST 控制消息终止这一次连接。
2、初识序列号
客户端告诉服务端自己的初识序列号,服务端发送ack并携带自己的初识序列号,客户端在对服务端的消息发送ack。
为什么不两次握手或者四次握手:
两次握手:无法避免历史错误连接的初始化,浪费接受方资源。
四次握手:TCP 协议的设计可以让我们同时传递ACK 和 SYN 两个控制信息,减少了通信次数,所以不需要使用更多的通信次数传输相同的信息。