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 是面向连接的,就跟打电话一样。
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状态。