一个nagel算法的例子,Nagle算法

TCP的传输策略是什么?

一个nagel算法的例子,Nagle算法


window size流控过程:TCP是以数据段的形式传输数据的,一个数据段包含很多个字节,相当于批量传输为避免大量数据淹没接收方,采用流控技术,利用的是段头中的一个字段叫窗口尺寸(window size)一个简单例子从上往下过程:sender发送了一个2K的数据,因为SEQ=0,所以这个2K的字节编号是从0一直到2047这个数据到达receiver之后receiver的内存就被占据了一半,还剩下2K,所以这个接收方会回发一个确认:ACK=2048,WIN=2048,分别表示(累计)确认和剩下空间的大小sender再次发送了一个2K的数据,接收方的缓存全部被充满,会发确认:ACK=4096,WIN=0过一段时间接收方对缓存里面的数据进行了处理,从而空出了2K的空间,于是它马上发送了一个更新窗口,当然,这个更新窗口数据段里面WIN=2048,而中间因为没有再接受数据所以ACK=4096不变……别忘了TCP传输是双工的,也就是说sender/receiver可以交换,它们可以互为收发方一些发送策略:当窗口数为0时发送者不能正常发送数据段,除非发送紧急(Urgent)数据(例如用户想杀掉远端机器上的进程的时候)发送者可以发送一个字节的数据段,以便让接收者再次发送期待接收的字节号和窗口数(避免死锁)发送者不需要马上发送应用程序产生的数据,接收者也不需要马上发送应答(当收到数据的时候)接收方/发送方的优化远程交互telnet的最坏情形图示:优化方法:接收端可以推迟500ms发送确认分组和窗口更新窗口,以便可以免费搭载在处理后的回显分组内(free ride)发送端优化Nagle算法当数据以一次一字节的速度到达的时候,只发送第一个字节,然后将后续的字节缓存起来,直到发出的字节得到确认将缓存起来的字节在一个数据段中发出,再继续缓存,直到发出的数据得到确认Nagle算法在很多TCP上实现,但是有些时候最好禁用,例如当一个X-Windows应用在互联网运行的时候,鼠标的移动事件必须发送给远程计算机,把这些移动事件收集起来一批一批发送出去,使得鼠标的移动极不连贯傻瓜窗口综合症有大块数据被传递给发送端TCP实体,然而接收端的交互式应用每次只读取一个字节的时候,如下Clark解决方案 :阻止接收方发送只有1个字节的窗口更新,它必须等待一段时间,当有了一定数量的空间之后再告诉发送方总结 。
TCP到底怎样流量控制的?
一个nagel算法的例子,Nagle算法


所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收 。利用滑动窗口机制就可以实施流量控制 。原理这就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小 。考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据 。
之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁 。解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer) 。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段 。对方就在确认这个报文的时候给出现在的窗口大小(注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段) 。
TCP原理应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制) 。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层 。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收 。

推荐阅读