部分参考:https://blog.csdn.net/zhangdaisylove/article/details/47294315

源端口号:占2个字节,就是发起方的port

目的端口号:占两个字节,接收方的port

seq:占4个字节,发送方标记自己的segment的序列号,用以各个tcp报文的顺序。

ack:占4个字节,应答号,通常解释为期待接收到下一个序列号的报文,个人理解为这是第一个接收方未接收到的包

4位首部长度:占 4bit,表示tcp头部长度,单位为4个字节。

6位保留位

标志位:分别为URG、ACK、PSH、RST、SYN、FIN,

URG表示本包数据有紧急数据,ACK表示本包中ack值有效,PSH表示本包数据需要立即把本包数据从缓存区送出去,

RST表示连接有错误,重置连接,SYN表示建立连接,FIN表示结束连接。

16位窗口大小:表示接受方可以接受对方数据的缓存区大小。

16位校验和

16位紧急指针:当URG被置位时,该值表示从开始到该值所指字节都是紧急数据。

一:滑动窗口

有时候接受方的缓存区已经满了,这个时候如果继续发送数据,那么接收方就会把数据丢弃掉,这样会白白浪费流量,所以在TCP的ACK中每次都会通知发送方自己可以接受的数据大小,也就是TCP报文中的16位窗口值,如果窗口变成了零以后,那么发送方就会停止发送,一直等到接收方可以接收数据,但是一直等待会出问题,如果其中ACK丢了,就会以为对方还不能接收数据,这个时候发送方可以发送窗口探测包。其中数据为0。

解释:当发送方收到接收方发来应答包后,应答号ack,加上报文中的窗口值减一,就是目前接受方的缓存最大可接受的数据包序列号,如下图ack=4,窗口值为6,那么4+6-1=9,也就是说发送知道目前最大可发送的数据包序号只能到9。

这就是滑动窗口,ack表示了窗口的左边界,ack+wind-1是窗口的右边界,即[ack,ack+win-1]区间,

目前只可以发送seq属于[ack,ack+win-1]区间的tcp数据包。由于ack一直变化,所以[ack,ack+win-1]属于向右滑动。

二:拥塞控制:

拥塞控制的目的避免网络拥塞,同时最大化网络利用率。不能一开始就发送大量数据到网络,以免造成网络拥塞,要对网络进行试探,并实时根据网络状态控制发送量,这就是拥塞控制的目的。这是一种试探网络状态的算法,判断当前网络最大可以一次性发送多少个MSS且不会导致网络拥塞。(MSS是TCP最大段大小,根据MTU计算,MTU为1500,则MTU-IP头-TCP头=1460)。

1. 如何实现:

拥塞控制的实现就是调整两个值:拥塞窗口值(cwnd),拥塞窗口阈值(ssthresh)。拥塞窗口阈值ssthresh是前一次拥塞时cwnd值的一半,建立连接之初,拥塞窗口cwnd=1,阈值ssthresh可以为无限大(因为不知道网络发送流量上限是多少,无法确定,设为一个较大值(ssthresh=65536),进行试探,或者指定其他适当值)。

2. 调整两个值的流程:

1)连接建立之初只发送一个数据包(cwnd=1),假定当前状态是最差,这样对网络负荷影响最小(避免拥塞)。

2)如果没有出现应答超时或者重复应答(网络没有拥塞,那么继续加大流量(最大化网络利用率,同时要避免拥塞

  • 此时当拥塞窗口在其阈值之下时(cwnd<ssthresh),继续翻倍增长窗口(cwnd=2*cwnd就是翻倍发送量)
  • 如果在阈值之上(cwnd>=ssthresh),则线性增加窗口值(cwnd=cwnd+1)。

进入2);如果出现拥塞则进入3)。

3)出现应答超时或者重复应答(网络已拥塞,探测到拥塞值),如果

  • 如果应答超时,将拥塞窗口阈值变为超时时的拥塞窗口的值的1/2(ssthresh=cwnd/2),将拥塞窗口值变为1(cwnd=1),并(网络状况很差,避免拥塞,立即将窗口设为0
  • 如果重复应答,将拥塞窗口阈值变为重复应答时拥塞窗口值的1/2(ssthresh=cwnd/2),然将拥塞窗口值变为阈值并加3(cwnd=ssthresh+3),然后。(网络状况有点差,但是没有很差,窗口缩半)

进入2)。

解释:这是发送方主机主动控制的值,是为发送方的TCP建立的一个受网络状况而定的窗口。每次发送数据时都会根据拥塞窗口和滑动窗口(对方ack应答包中的16位窗口大小大小对比,选取值小的那一个作为数据包的长度值。

拥塞控制是最大化网络利用率,流量大小随网络状态动态调整。开始值要小但是要快速增加(指数增加),当到达阈值时流量增速要放缓(线性增加)以免很快又造成网络拥塞,另外由于第一次建立连接ssthresh的值较大,一般第一次     只会出现进翻倍发送。典型图如下所示:

总结:拥塞窗口阈值总是变为发生拥塞时的1/2(ssthresh=cwnd/2),拥塞窗口值在应答超时时变为0,在重复应答时变为当前值1/2后再加3(即新阈值加3)。

三、拥塞窗口和滑动窗口

拥塞窗口也可以决定出一个最大的发送序列号,滑动窗口也可以,需要二者取其小。另外拥塞窗口是发送方主动感知网络状态,进而决定的发送数据的流量,而滑动窗口是接收方告知发送方的。

四、其他

3:超时控制,窗口控制,流量控制,拥塞控制对比

1)超时控制,只是在每一个数据都要确定收到 ACK没有收到ACK超过时间限定就会重发。

2)窗口控制,会对持续收到的同一个ACK三次以后重发数据,并且如果长时间没有收到ACK,那么也会重发数据

3)流量控制,就是确认接收方是否有足够缓存接受数据,否则一个劲发会浪费网络流量。

4)拥塞控制,这个是试探网络是否可以接受目前的数据发送大小。

5)网络主机缓存一起决定着数据发送数据的大小。

4:延迟应答

有时候没必要对每个数据都立刻发送ACK,可以稍微等待下一个数据也收到了,然后发送ACK,或者等待时间过长发送ACK

5:捎带应答

就是把应答放在其他的数据包中一起发送过去。

6:半关闭:

TCP 的 shutdown() 可以停留在一个只接收数据,而不写数据的状态中,这个时候状态称为半关闭。

TCP报文、滑动窗口、拥塞窗口解释相关推荐

  1. 关于TCP报文段以及拥塞窗口cwnd的理解纠正

    @(计算机网络) 在普通的拥塞控制算法中,我们总是粗粒度的关注每个RTT拥塞窗口的变化,比如初始报文段MSS = 1KB,在慢开始阶段增长规律是1→2→4→8...1\rightarrow 2\rig ...

  2. TCP/IP中的拥塞窗口控制机制

    TCP拥塞控制是通过控制一些重要参数的改变而实现的.TCP用于拥塞控制的参数主要有: (1) 拥塞窗口(cwnd):拥塞控制的关键参数,它描述源端在拥塞控制情况下一次最多能发送的数据包的数量. (2) ...

  3. tcp发送窗口(滑动窗口)、拥塞窗口

    TCP发送窗口拥塞窗口试题分析 题目一: 来源2015年408计算机综合 试题链接:https://www.nowcoder.com/questionTerminal/3241441c88f04ab5 ...

  4. 滑动窗口与拥塞窗口_流云哭翠-ChinaUnix博客

    一.滑动窗口 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的. 对ACK的再认识,ack通常 ...

  5. tcp协议栈优化1-增加TCP初始拥塞窗口

    看linux3.0 network代码,发现TCP initcwd(初始拥塞窗口)默认已经调为10,同时,TCP rcvwnd初始接收窗口也已调为10.      tcp initcwd初始化函数-- ...

  6. TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)

    1.tcp通告窗口/接收窗口/发送窗口 接收端有一个接收窗口大小,接收端只能接收这么多数据,接收窗口的数据需要被上层接收后才释放更大接收空间,才可以接收更多数据:接收窗口之前的数据已经被接收,再次接收 ...

  7. TCP报文( tcp dup ack 、TCP Retransmission)

    最近因使用FTP 上传数据的时候总是不能成功,抓包后发现 TCP 报文出现 TCP dup ack 与 TCP Retransmission 两种类型的包.收集整理下 TCP dup ack (重复应 ...

  8. 网络:传输层 TCP报文格式解析

    一.TCP报文格式 1.为了提供可靠的数据传输,TCP报文首部字段有较多的字段,TCP报文格式如下图: 图2 TCP报文格式 16位源和目标端口(16位):用于多路复用/多路分解来自或送至上层应用的数 ...

  9. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

最新文章

  1. Sql Server 2012 分页方法分析(offset and fetch)
  2. 二叉树代码我写得很乱!!!整理一下思路
  3. 数据结构与算法(C++)– 树(Tree)
  4. 3.1 cat:合并文件或查看文件内容
  5. spring学习(44):p名称空间注入
  6. kafka retries参数入门
  7. IBM上线了一个人工智能,叫做Project Debater,堪称辩论神器!
  8. 教你正确修改handsome博客模板页面宽度
  9. 二十一世纪大学英语读写教程(第三册)学习笔记(原文)——5 - America Seen with European Eyes(概说美国——欧洲人眼中的美国)
  10. Android 8.0 、9.0源码编译问题记录
  11. 数据结构——折半查找法
  12. 百慕大区块链战略不仅仅为了赢得新公司的青睐
  13. UE4蓝图案例:媒体播放器的开关1
  14. 如何高效实现多窗口卖票
  15. mmap在嵌入式中的应用
  16. 除了打通各类知识平台的激励系统,他们还想做国际领先的区块链技术社区
  17. webrtc部分手机黑屏的原因排查
  18. php正则匹配input,正则表达式 - php正则匹配p标签及带特定的中文
  19. PCL demo运行
  20. STM32实现定时器控制LED闪烁

热门文章

  1. Android调用系统自带的文件管理器进行文件选择
  2. 右键新建没有Word怎么办?右键新建添加Word方法!
  3. 论文实证分析怎么写?
  4. jQuery学习理解(详细)
  5. toLua:简洁的使用说明
  6. conda安装tensorflow和conda常用命令
  7. 不容错过的精美的树形表格treegrid在项目里面使用总结
  8. Transformer解读之:Transformer 中的 Attention 机制
  9. H5C3进阶——播放器
  10. 2020年全球及中国术后镇痛药行业市场现状分析,非阿片类药物需求不断增长「图」