TCP连接过程中的一些知识点

本文深入解析三次握手的必要性,防止历史连接问题、同步初始序列号以减少资源浪费,并探讨四次挥手、TCP保活机制及常见问题如重传、滑动窗口等。还讲解了糊涂窗口综合症、拥塞窗口控制和Nagle算法,揭示了TCP连接管理的复杂性。
摘要由CSDN通过智能技术生成

douyin LSY_HELLOWORLD,已成功入职互联网大厂,请关注我,了解非科班的程序员的工作生活把

三次握手正常过程中

问题,为什么是三次握手?而不是二次也不是四次?

  1. 阻止重复历史连接
  2. 同步双方的初始序列号
  3. 避免资源浪费

1.阻止重复历史连接
如果只有二次握手,例如在客户端发出syn请求,服务器就返回ack建立连接的情况下,如果:
发出了syn请求 seq=1,
因为网络阻塞,重发的新的syn请求seq=2,
然后旧的syn又先到了服务器,则服务器第二次握手给客户端ack 1+1,认为建立连接
但是此时旧连接已经被客户端丢弃了,就会造成连接错误,
而如果是三次握手,客户端收到ack 1+1后,发现这不是自己当前的序号,就会通知服务器rst,然后服务器就会中止这个握手。一段时间后swq=2过来,ack 2+1,然后客户端第三次ack建立连接

2.同步双方初始序列号
序列号是可靠传输的关键因素:
可以保证接收方去除重复数据,
可以保证接收方按序接收数据,
可以保证发送方知道哪些数据成功发送。
第一次握手客户端发送序号,第二次握手服务端确认序号,发送自己需要,则也需要第三次握手的客户端确认服务端的序号。

3避免资源浪费
如果只有两次握手,客户端发送了SYN请求,由于网络阻塞可能重复发送了多个,如果服务端每收到一个SYN请求就直接建立连接,则会发生过多无效的连接。

四次挥手的正常过程

为什么要有time_wait状态
1 防止旧连接的数据包延迟到到
例如旧连接有一个包序号为100阻塞在网络上,当前TCP连接关闭了,并且在同一个端口建立了TCP连接,序号从90开始,如果发送到了seq=99之后, 旧连接的序号100报文到了,就会产生错误。而time_waIt可以保证网络上不再有未到达的报文。
2 正常关闭服务端
如果第四次握手发送ack后客户端直接关闭,如果这条消息丢失了,服务端就无法正常关闭,会重发第三次握手,一直处于last_ack状态。
只有主动断开方才会有time_wait状态,如果状态过多会有什么影响?
占用内存资源和端口资源,一旦端口消耗完毕则无法建立新的连接。

TCP保活机制

默认情况下,如果2个小时TCP连接没有相关活动,就会每隔一个75秒发送一个探测报文,如果连续9次探测都没有响应,就认为对方不可到达,则会断开本次连接。

TCP 连接过程中的问题

重传机制

超时重传 当超过一定时间RTO没有收到ACK报文,就重新发送,有两种情况
一种是发送报文丢失,一种是服务端ACK报文丢失,对于第二种情况,服务端会收到重复的报文,根据序列号去除重复的即可。
RTO应该略大于RTT(round-trip time往返时延)
快重传当收到三个连续的ACK报文时,就认为丢失,立刻重传。
例如发送了seq1,2,3,4,5,6,却收到了3个ACK2,代表服务器正常收到了seq1,而2丢失,因此客户端立刻重发2,服务器收到2后确认seq6 发送ACK7。
有一个问题就是客户端只知道收到了seq1,那后面的有几个需要重发呢?因此有了SACK方法。
SACK会将自己收到的缓存发送给发送方,这样发送方就知道缺少什么,然后重发了。

滑动窗口

如果TCP每发送一个数据包,就进行一次ACK确认再发送下一个,这样效率太低下。因此引入滑动窗口,使得可以一次发送多个,然后慢慢接收ACK。
ACK确认之前所有的数据包,不用对每个包都确认一下,这叫做累计应答。
发送窗口和接收窗口并不完全一致,滑动窗口是动态变化的。
服务器如果处理能力变慢,可接受的数据就会越来越小,在接收到发送方的数据时,ACK就会发送当前可接收的数据,然后直到发送窗口变成0.
此时发送方停止发送数据,直到服务器将数据处理完毕,给客户端发送接收窗口,等待客户端发送数据。如果这条报文丢失了,就会陷入死锁
为了解决可能陷入死锁的问题,TCP为每个连接设有一个持续计时器,当收到零窗口通知时,启动持续计时器,超时后发送窗口探测报文,对方告知当前的窗口大小。

糊涂窗口综合症

如果接收窗口很小,而发送发义无反顾的发送这几个字节的内容,就是糊涂窗口综合症。
因为每发送一次报文,需要有IP头+TCP头 20+20字节的开销,仅为了传输几个字节,太浪费资源了。
解决办法,一是让发送方不发小的,二是让接收方不收小的。
MSS最大报文长度
使用Nagle算法,对于发送方,满足窗口大小或者数据大小大于等于MSS,或者收到了上一条的ACK才可发送当前数据。
对于接收方,当窗口大小小于min(MSS,缓存窗口/2)的时候,就向发送方通知窗口为0.

拥塞窗口

如果网络阻塞,造成数据延迟,丢失,然后重传更多数据,造成阻塞更严重,恶性循环。因此需要对自身加以控制。
拥塞窗口cwdn是发送方维护的一个状态变量。根据网络的拥塞程度动态变化。
swnd=min(cwdn,rwdm)
cwdn变化的规则,当网络拥塞时,cwdn变小,网络通畅时,cwdn变大。
当没有按时收到ACK报文,即认为网络发生了拥塞。
慢开始
cwdn一开始为1,每收到一个ACK,cwdn就+1。
于是cwdn为1,发送一个数据报文,收到一个ACK,
cwdn为2,发送2个数据报文,收到2个ACK,
cwdn为4,发送4个数据报文,收到4个ACK,
cwdn为8,发送8个数据报文,收到8个ACK
可以看出来从1开始指数增大,直到到达慢启动门限ssthresh,开始变为线性增大,每次+1
拥塞避免
一旦出现了拥塞,ssthresh=cwdn/2,cwdn=1重新开始慢启动。
快重传
当接收段收到seq 2 seq 4而没有收到3就会ACK3,然后发送端继续发送后面的,接收端重复ACK3,直到连续收到3个ACK3,发送端就会重发seq 3。
快恢复
因为发送端可以收到ACK,因此不认为是网络拥塞,只是个别报文走偏,不启动拥塞避免。而启动快恢复算法。令ssthresh=cwdn/2, cwdn=cwdn/2+3。因为已经收到了三个ACK,证明有三个已经达到了接收端,不会占用网络资源,因此窗口可以+3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSY_HELLOWORLD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值