TCP(2)

1.累计ACK

我们之前说TCP数据是分段(segment)发送的,发送端发送一段,接收端回复一个ACK。而且ACK可以依附在数据上进行回复。但是每段回复一个小小的ACK貌似有点占用流量。累计ACK的意思是,7,8,9段在滑窗内,8和9段已经收到了,这时如果7段接收到了,那么7,8段的ACK就不必发了。因为ACK是告诉发送端发送下一个段,而9段之前完全都接收到了,那么直接发送9段的ACK即可。

接收端在回复ACK时都会有一些延迟,这时如果有后续产生的ACK数据段,那么ACK就采用累计发送的方式。这样可以节省一些流量。

2.滑窗结构

滑窗是以byte表示大小的。

发送端:(offered window)分为两部分。Not Received ACK和Being send。第一块意思是还没收到ACK回复,第二块意思是待发送。

接收端:(received window)分为两部分。Received ACK && Not send to proc和Advertise Window。第一块代表着ACK回复过了,端口缓冲区接到数据了,但是程序还没有处理。这样就会占用缓冲区的大小。Advertise Window 又可分为Received && not ACKed 和Not Received。Advertise Window的大小如果为0,则无法继续处理发送端传来的数据。又或者发送端速率大于接收端速率,也注定会有数据溢出。

3.流量控制

我们看到了Advertise window窗口的变化必须要让发送端知道。这样发送端得到Advertise window后,调整offered window的大小,窗口一变小发送速率就降下来了。

如果Advertise window的大小为0时,发送方知道后会停止发送,并隔一段时间进行窗口探测。也就是发送1byte大小的TCP段,如果探测回来仍然为0,那就延迟更长时间后再探测。

如果Advertise window大小不为0,但是很小。这时候TCP发送很小的数据,之后接收端处理又腾出来一段很小的空间,那么发送端傻乎乎地每次发一小段数据。而数据中TCP的头部占用极大的空间,数据很小。这样就造成一些流量的浪费。为避免这种情况,TCP规定:

接收端的敞口也要有一定的长度否则等待;发送端发送的数据要有一定的长度,否则等待。

4.超时重新发送

发送端发送出片段时,开始计时。如果超过RTO时间未收到ACK回复则会认为该段丢失,从而重新发送。但是超时时间怎么算呢?网络情况不同,设置的超时时间也应该不同。一般情况下,采样传输往返时间来决定。发送端通过采样获得传输的平均时间,通过平均时间加上误差即可设置超时时间。这种设置方法是以平均值为基本参照的,但是方差的大小同样也反应了网络的状况。方差越大,网络越不稳定,此时设置的超时时间也应越大。

5.快速重新发送

快速重新发送是优于超时重新发送的策略。应用的场景如7,8,9段先收到9段,但8段还没收到。这时会发送ACK8,向发送端寻求8段。这时如果继续收到后面的段,那么接收端会继续回复ACK8段。如果继续接收的是乱序,则接收端会继续要求ACK8。如果发送了3次ACK,那么发送端就会终止计时,立即发送8段。这就是所谓的快速重发。之所以叫快速重发,是相较于超时重发而言的。

时间: 2024-10-08 15:46:13

TCP(2)的相关文章

黑马程序员 【】java学习之路——TCP(三)客户端上传文件到服务器

------- <a href="http://www.itheima.com" target="blank">android培训</a>.<a href="http://www.itheima.com" target="blank">java培训</a>.期待与您交流! ---------- import java.io.*; import java.net.*; class

深入理解TCP(二)

上一篇http://www.cnblogs.com/whc-uestc/p/4715334.html中已经讲到TCP跟踪一个拥塞窗口来(cwnd)提供拥塞控制服务,通过调节cwnd值以控制发送速率.那么TCP如何基于丢包事件来设置cwnd值?通过TCP拥塞控制算法来实现.TCP拥塞控制算法主要有三部分:慢启动.拥塞避免.快速恢复. 1.慢启动 当一条TCP连接开始时,cwnd的值一般初始设置为MSS的较小值.因为只有当发送方接收到ACK,才会更新cwnd的值,所以在一个RTT时间内,发送方只能发

Qt网络编程———TCP(1)

TCP即Transmission Control Protocol,传输控制协议.与UDP不同,他是面向连接和数据流的可靠传输协议.也就是,他能够使一台计算机上的数据无差错的发往网络的其他计算机,所以当药传输大量数据时,我们选用TCP协议. TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器程序.我们在服务器端进行端口的监听,一旦发现客户端的连接请求,就会发出newConnection()信号,我们呢可以关联这个

UDP和TCP(1)

1.UDP协议 UDP协议是传输层的一个不可靠的协议.之前看过物理层.连接层.网络层的协议.Vamei大神的比喻很好,说UDP是IP协议在传输层的傀儡,之所以存在的必要时IP协议不包括端口号,而UDP和TCP都是包括端口号. 端口号是应用程序的资源,不同的应用程序可以占用不同的端口号.程序运行时,操作系统内核从不同端口号获取的消息就提供给占用相应端口号的程序处理. Vamei大神把网络协议比喻成协议森林我觉得很恰当.连接层协议如以太网.WiFi.ARP协议比喻为树根:IP协议比喻成树干:UDP或

Syslog-ng+Rsyslog收集日志:RELP可靠传输,替代UDP、TCP(五)

在传输过程中TCP虽然比UDP可靠,但是是明文传输,Rsyslog提供了一个比TCP更可靠的传输,RELP.RELP传输,不会丢失信息,但只在rsyslogd 3.15.0及以上版本中可用. 使用RELP需要两部,开启omrelp模块,在传输时将TCP的@,替换成":omrelp:"(黄颜色部分) 用法: *.* :omrelp:server:port 例子: *.* :omrelp:192.168.0.1:514 vi /etc/rsyslog.d/ssh-log.conf # rs

TCP(一)

TCP的特点:三次握手.四次挥手.可靠连接.丢包重传.所有的关键词都围绕着可靠传输. 实现可靠传输的核心机制:seq+ack.通过ack判断是否有丢包,是否需要重传. 三次握手 1)初始状态:client为CLOSED,server为LISTEN,此时client 发送 syn 到server ,client状态变为SYN_SENT: 2)server 收到 syn后回复syn+ack给client,client状态变为SYN_RCVD: 3)client 收到syn+ack后,回复ack向se

人人都该懂点儿TCP(转)

作者:Julia Evans 译者:赖信涛原文链接:Why you should understand (a little) about TCP 译文链接:http://geek.csdn.net/news/detail/44474 即使你的工作也许不需要对TCP了如指掌,也不需要去了解具体的TCP/IP实例.你也应该懂一些基本的TCP知识,本文会告诉你为什么. 我以前在Recurse Center工作的时候,曾经用Python写过一个TCP栈(还写了一篇博文用Python实现TCP栈可以学到什

TCP(二)

TCP半连接和全连接问题 TCP握手过程详解 如上图所示,关键部分:syns queue(半连接队列)和accept queue(全连接队列) 正常情况下的处理过程如下: 1)当server端收到client发送的SYN后,将连接相关信息放在syns queue中,并回复SYN+ACK: 2)当server端收到client发送的ACK后,将连接相关信息从syns queue中取出并放在accept queue中. 异常情况: 步骤2)中如果accept queue满了,则根据tcp_abort

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协