欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP为啥是可靠的

程序员文章站 2022-03-12 09:17:21
...
TCP为啥是可靠的?

首先 TCP 是面向连接的,就跟打电话一样。

TCP报文格式:源端口、目的端口、校验和、序号、确认号、窗口+数据部分

TCP 是如何保证连接的了?

1.序列号
TCP在传输的过程中,对每一个字节都进行了编号,这就是序列号.

序列号的作用:

1.确保数据按序到达
2.保证可靠性(比如说缺哪个序号的数据就能知道)
3.提高效率,可以多次发送,一次确认
4.去除重复数据


2.校验和
校验和用于检验端到端传输的过程中,TCP头部和数据部分是否发生了变化.在计算校验和的时候添加16位的伪首部用于增强校验。将数据分成16位的多个段,每个段取反相加。


3.拥塞控制

拥塞控制采用慢启动的策略,首先开始的时候,拥塞窗口为1进行试探,然后采用快开始的策略,以指数的方式增大拥塞框框,当达到阈值时,以线性的方式进行增大拥塞窗口。当网络发生拥塞时,将拥塞窗口的大小设置为当前的一般,然后开始慢启动。


4.超时重传
当客户端给服务端发送数据,由于网络等原因,数据包没有到达服务端,或者服务端的响应数据包没有在超时重传的计数范围内到达,导致启动超时重传机制,重新发送数据.


5.流量控制
流量控制涉及到客户端和服务端的协商。TCP报文首部中有一个窗口字段,当客户端向服务端发送数据后,服务端向客户端发送确认报文,报告服务端框框的剩余容量是多少。

6.确认应答
客户端发送一段数据后,需要等待服务端进行确认。当没有收到服务端的确认时,启动超时重传机制。

7.连接管理

三次握手

客户端:A,服务端:B
第一次握手:A向B发送报文,SYN=1,seq=x.
第二次握手:B向A发送确认报文,SYN=1,ACK=1,seq=y,ack=x+1
第三次握手:A向B发送确认报文,ACK=1,seq=x+1,ack=y+1

为啥需要三次握手了?防止资源浪费。比如说A向B发送建立连接的报文,由于网络的原因导致该报文滞后到达B,那么B收到报文后,以为A要建立连接,给A回一个报文,同时建立连接,等待A发送数据过来。A收到B发出的响应报文后,但是它知道自己没有发,就不理会该报文,导致B一直等待,浪费资源。

四次挥手:

客户端:A,服务端B
第一次挥手:A向B发送连接释放报文,FIN=1,seq=u,A进入WAIT-1
第二次挥手:B向A发送响应报文,ACK=1,seq=v,ack=u+1,A进入Wait-2,B进入Wait
第三次挥手:B向A发送连接释放报文,FIN=1,ACK=1,seq=w,ack=u+1
第四次挥手:A向B发送响应报文,ACK=1,seq=u+1,ack=w+1,A进入等待时间.

等待时间为2MSL(最长报文段寿命)

为啥需要2MSL了?
1.为了防止已经失效报文出现在网络中。当A发送最后的ACK报文后,再过2MSL时间,在建立连接产生的报文都将从网络中消失,避免出现在下一次新的连接中。
2.等2MSL是为了确保A发送的报文能够到达B,确保A和B都正常进入close状态。
相关标签: TCP 可靠