Maximum Segment Size,TCP一次传输发送的最大数据段长度。

来了解2个TCP的概念:

MSS:Maximum Segment Size,TCP一次传输发送的最大数据段长度。

RTT:Round-Trip Time,往返时延,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。

TCP传输大块数据时,肯定需要进行数据分段,而每个分段所能携带的最大数据就是1个MSS,假设大块数据为100个MSS,那么发送方发送的方式大概有如下两种:

1、  每次发送1个,收到接收方确认后,才发送下1个;

2、  一口气发送100个,然后收到对方一起确认;

显然,方式1中,一个RTT只能处理一个包,这样的传输效率太低了。而方式2看似很美好,实际会存在两个问题,一个是接收方的接收窗口未必能一次性接收这么多数据,另外一个是网络的带宽也不一定足够大,容易出现丢包事故。前一个问题就是标题中的流量控制(Flow control),TCP采用的是滑动窗口机制(Sliding window),后一个问题就是标题中的拥塞控制(Congestion control)。发送方的发送窗口或者说网络传输交互就取决于这两个问题的控制,谁控制的更严格,谁就占据了决定性因素,这也是为什么两者总是一起出现一起被讨论。

流量控制(Flow control):

TCP uses an end-to-end flow control protocol to avoid having the sender send data too fast for the TCP receiver to receive and process it reliably. Having a mechanism for flow control is essential in an environment where machines of diverse network speeds communicate.

TCP使用端到端流量控制协议来避免发送方发送数据太快,以致TCP接收方不能可靠地接收和处理数据。在不同网络速度的机器进行通信的环境中,具有流量控制机制至关重要。

                                    图一

图一为通过Wireshark抓包192.168.2.1和192.168.2.198的交互截图,可以看到有个标记Win,这个标记的含义就是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

[TCP zerowindow]& [TCP window Full]

提到Win标记,就顺便谈一下Wireshark的[TCP zerowindow]和[TCP window Full],当Win=0时,Wireshark就会打上TCP zerowindow,表示缓存区已满,不能再接收数据了。当Wireshark在一个包上打上TCP window Full,就表示这个包的发送方已经把对方声明的接收窗口耗尽了。两者的共同特点都是传输暂停,前者的含义是发送方无法再接收数据,后者表示发送方无法再发送数据。

回过头来再来说滑动窗口。

              图二截取自《TCP/IP详解》

                图三取自参考资料

                 图四取自参考资料

图二和图三可以知道接收方会通知发送方当前已接收到的信息和可用窗口信息。

图三和图四可以看出来窗口滑动的过程。

总结:TCP的流量控制由滑动窗口来实现的,滑动窗口控制流量取决于接收方的窗口大小。

 

拥塞控制(Congestion control):

流量控制是端到端的交互,如果只是局域网内的两台设备交互,我想通过滑动窗口大概能控制得不差,但是实际网络的情况非常复杂,发送方和接收方之间还有路由器和交换机,网络传输线路又复杂,这个时候就需要拥塞控制。

拥塞控制主要有四个算法:慢启动、拥塞避免、快速重传和快速恢复。

慢启动:

讨论慢启动算法先来了解下拥塞窗口的概念,这是慢启动算法为TCP发送方新增的窗口,congestion window,简称cwnd。对应上文,发送方取拥塞窗口和滑动窗口的最小值作为发送上限,即谁严格谁起决定因素。

1、  连接建立开始,发送方不了解网络的情况,cwnd初始化比较小的值,RFC建议2-4个MSS,具体视MSS的大小而定;

If (MSS <= 1095 bytes)

      then win <= 4 * MSS;

If (1095 bytes < MSS < 2190 bytes)

      then win <= 4380;

If (2190 bytes <= MSS)

      then win <= 2 * MSS; 摘自rfc3390.

2、  如果发送出去的包都被ACK,说明还未到达拥塞点,则增加拥塞窗口,RFC建议的是每收到n个ACK,则cwnd新增n个MSS,呈指数关系增长,虽然这个过程看似比较快,但是基数比较低,所以被称为“慢启动”。

拥塞避免:

其实慢启动除了维护了cwnd,还维护了慢启动临界值ssthresh,一般将ssthresh设置为65535字节。在cwnd<=ssthresh时,还是处于慢启动环节,一旦>ssthresh,开始进入拥塞避免。

RFC建议拥塞避免环节,无论一个RTT可以收到多少个ACK,每一次确认都只新增1个MSS,呈线性关系增长,避免快速的触碰到网络拥塞点。

              图五取自参考资料

快速重传和快速恢复:

进入拥塞避免之后,最终还是会碰到拥塞点,发送方此时迟迟得不到确认,当然得不到确认也有可能是因为延迟确认导致的。发送方此时决定等待一段时间,如果一段时间后还是得不到确认,就发起重传,这个过程叫做超时重传。从发出原始包到重传该包的时间叫做RTO(Retransmission TimeOut)。

进入超时重传后,RFC建议将cwnd设置为1个MSS,而对于ssthresh,RFC5681建议的是发生拥塞时未被ACK的数据量的1/2,但必须大于等于2个MSS。然后重新进入慢启动环节。超时重传因为需要等待RTO之后才能进入新的恢复环节,所以对网络性能的影响是比较大的。所以各路大神又想到了一个新的方式,看能否无需等待RTO,就发起重传,这种方式叫做快速重传。快速重传规定在收到3个及以上重复ACK时就触发重传,不再进入慢启动环节,然后直接进入拥塞避免,这个就是快速恢复算法。为什么是3个?因为1-2个重复ACK,很有可能是乱序,只有在3个及以上的时候才是有可能丢包了。关于具体快速重传和快速恢复的算法可以看下参考资料,已经写得非常详细了。

 

以上就是我对TCP流量控制和拥塞控制的理解,如有不当言论,欢迎留言交流反馈。

 

参考资料:

https://en.wikipedia.org/wiki/Transmission_Control_Protocol

https://www.douniuyuLept.com /wiki/TCP_congestion_control

https://www.feifanyule.cn /question/32255109

https://www.zhihu.com/question/38749788

https:// www.baohuayule.net /articles/11564.html

https://www.jxbaxi.com/ articles/11609.html

http://www.ysgj1688.com.ece.gatech.edu/4110/TCPTimers.pdf

http://www.xuancayule.com//RealtimeMantra/Networking/TCP_Slow_Start.pdf

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Socket编程中,单次传输数据的大小是有限制的。这个限制取决于操作系统和网络环境。在大多数操作系统中,Socket发送和接收数据的缓冲区大小是有限制的。如果发送的数据超过了缓冲区的大小,数据将被截断或丢失。一般来说,最大的单次传输数据量是可以通过设置Socket选项来进行调整的,但是不能超过操作系统和网络环境所限制的大小。此外,对于TCP协议,由于其面向连接的特性,如果一次性发送的数据太大,可能会导致网络拥塞和数据丢失,因此需要进行分片和多次传输。 ### 回答2: Socket传输数据的大小是有限制的,但是具体的限制取决于操作系统和网络协议。 在TCP/IP协议中,TCP协议使用滑动窗口机制进行流量控制和拥塞控制。这意味着在TCP连接中,发送方和接收方之间的数据传输受到一些限制。 在一次传输中,发送方可以一次性发送多个数据包,但接收方可能无法一次性接收完所有数据包。这可能会导致数据包的丢失或拥塞。为了避免这种情况,TCP协议会按照一定的规则进行数据分段和重组。 操作系统也会对单个Socket传输数据的大小进行限制。例如,在Linux中默认的TCP缓冲区大小是64KB,这意味着单次传输数据的最大大小是64KB。 对于UDP协议来说,虽然没有流量控制和拥塞控制机制,但也有最大传输单元(MTU)的限制。MTU是数据链路层中一次传输的最大数据量,通常为1500字节。 需要注意的是,TCP和UDP在不同的网络环境下的最大传输单元大小可能有所不同,因为不同的网络设备和协议都可以影响传输数据的大小限制。 综上所述,Socket传输数据是有大小限制的,具体的限制取决于操作系统、网络协议以及网络环境。 ### 回答3: Socket单次传输数据的大小有限制。 在TCP协议中,每次发送数据时,TCP报文的总大小是有限制的,这是由TCP报文段的最大值(Maximum Segment Size,简称MSS)决定的。MSS是指在TCP报文段中,负载数据部分的最大长度,一般为MTU(Maximum Transmission Unit,最大传输单元)减去IP头和TCP头的长度。 而在UDP协议中,由于其没有像TCP一样的拥塞控制机制,因此,虽然没有像TCP的MSS限制,但仍然存在IP包大小的限制。在IPv4网络中,IP数据报的最大长度为65,535个字节。 不论是TCP还是UDP,Socket传输数据时,一般不能一次性发送超过这些限制的数据。如果要发送超过这些限制的数据,需要将数据分割成多个较小的片段,然后分多次发送。 需要注意的是,在实际编程中,由于应用层和操作系统的限制,Socket库和操作系统往往会对发送和接收的数据长度做进一步的限制。因此,编程中需要根据具体的情况,确保数据传输的正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值