tcp协议的特点
- 面向连接的字节流传输
- 超时重传机制
- 拥塞控制机制
- 拥塞窗口(window)
- 慢启动(每一次传输的字节数都翻倍,也就是2的指数次方传输数据)
- 拥塞避免(当慢启动出现传输超时,马上启动拥塞避免算法。将穿的字节数减少一半。每经过经过一次RTT发送的tcp报文加1)
如下图
- 快速重传 (接受方接收到失序的数据包后立即返回“重复确认”,连续收到三个“重复确认”信号,就启动重传机制,不需要等到超时再重传)
- 快速恢复 (快速重传后,将发送的报文数减为原来的一半,启动拥塞避免算法)
如下图
tcp协议的报文格式
- SYN = 1表示请求建立链接
- FIN = 1表示请求断开链接
- ACk = 1表示数据信息的确认
- RESET = 1表示强制断开链接
tcp的三次握手
- 第二次握手将第一次握手的ack,和服务端发送的syn合并在一起了,所以有了三次握手就能确保当前服务端和客户端的数据时有来有回的
如果第二次的握手不合并的话,就需要四次握手才能验证客户端和服务端的都有来有回。(如下图)
tcp四次挥手
- 为什么需要四次挥手而不是三次
- 第一次挥手:客户端向服务端发送断开连接请求
因为服务端接受到客户端断开连接的请求后,不能立即将需要响应的数据马上处理好,并将允许断开连接的信号和数据一起发送给客户端。(因此有了第二次挥手和第三次挥手)
- 第二次挥手:服务端先将允许断开链接的信号发送给客户端
- 第三次挥手:服务端将处理好的数据发送给客户端
- 第四次挥手:客户端接受到数据后返回一个ack信号给服务端,断开tcp链接 注意点:
- 第三次挥手后客户端会有个timeWait时间,为2倍的报文最大生存时间。如果超过timeWait时间没有接收到。客户端将断开连接。
- timeWait为什么时2倍的报文最大生存时间?
- 原因1:当第四次客户端发送的ack信号因为网络传输原因发生了丢失,服务端能再次因为超时重发fin包。客户端能需要留有足够的时间来等待第二次的fin包,在重新发送ack给服务端。(本质就是客户端尽量的护送第四次的ack能到达服务端,尽量确保服务端也能同时关闭tcp连接)。因此timeWait设置为2倍的报文最大生存时间。
- 原因2:因为网络的tcp数据包传输时有序列号的,客户端断开tcp连接后。又再次建立tcp连接。这是上次tcp连接的数据包达到了而且与新tcp数据包的序列号一样。这样就有可能导致接受的数据混乱了。timeWait就是设置做够长的时间等上次tcp连接的数据包全都在网络中消失。
- 超过timeWait时间,则客户端就不管了。直接断开链接释放对应的断开等。
- 若在timeWait时间后服务端的fin到达了客户端,这是客户端直接返回reset信号给服务端,告诉服务端直接断开连接。
tcp中的MSL,TTL,RTT概念
- MSL:报文最大生存时间(一般是30s,1min或2min。在linux系统中我们可以设置这个时间)
- TTL:报文最大路由转发数(ttl在tcp数据包中是一个8位数据,最大值为255,每经过一次路由转发就减1,为0是则抛弃当前数据包)
- RTT: 数据包往返所需的时间(tcp协议中每个数据包都有序列号,返回的ack数据包中也会包含该序列号,这样就可以通过计算每个数据包的来回时间了既RTT)