《计算机网络笔记》——TCP

《计算机网络笔记》——TCP,第1张

《计算机网络笔记》——TCP

参考资料:刘超老师的《趣谈网络协议》、王道考研《计算机网络》

TCP的特点
  • 面向连接:三次握手、四次挥手
  • 有序可靠:累次确认、丢失重传、超时重传
  • 点到点:运输层解决不同主机进程通信问题,但实际上TCP连接的是进程的端口
  • 窗口和RTT动态变化
  • 全双工通信:TCP连接的每一端都有两个窗口:发送窗口与接收窗口
  • 面向字节流
面向字节流

应用层将信息变成二进制流,再发给传输层。传输层再将二进制流变成数据报发送出去。

因为是面向字节流,因此TCP的传输机制是根据字节的序号进行的,而不是报文段。

TCP会根据对方的窗口大小以及信道拥塞程度,来决定发送多大字节的报文段。

TCP报文段 首部
  • 端口
  • 序号
  • 确认号
  • 数据偏移、保留、标识、窗口
  • 校验、紧急

32bits * 5 = 20 字节,固定首部为20字节 。还有4字节是选项和填充字段,用来保持TCP首部长度。因此共24字节。

序号字段

序号就是报文段的序号。报文被分隔成很多的报文段,每一段的报文段的序号就是该段第一个字节的序号。注意是以字节为单位。

确认号字段

就是我想要从对方得到的报文段的序号,主要用于告诉对方下一次应该发什么给自己。

注意因为是用‘C’传递,所以Seq才会递增1的,具体的Seq号还得看数据的大小

状态标识字段 SYN 与 FIN

用于连接过程。SYN置为1表示请求建立连接,FIN置为1表示请求断开连接

数据缓存

发送方缓存

  • 准备发送的数据
  • 已发送未确认的数据

接收方缓存

  • 按序到达,还没上交给应用层的数据
  • 不按序到达的数据
TCP的功能
  • 连接
  • 可靠传输
  • 流量控制
  • 拥塞控制
连接过程 三次握手
  • 客户发送一个SYN报文段,表示我想请求与你连接
  • 服务器会从该数据报中提取出TCP SYN 报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段,表示我同意与你连接,这个报文段称作SYNACK报文段
  • 客户接收到SYNACK报文段后,也会为TCP连接分配TCP缓存和变量,同时再发送一个报文段给服务器,告诉它我收到了你同意与我连接的信息了。

初始序号ISN

为什么不能两次握手

四次挥手

MSL

报文在网络中存在的最长时间,超过这个时间报文就要被抛弃。

为什么要等待2MSL?

  • 保证最后一个ACK报文到达
  • 防止“已失效的连接请求报文段”出现在本连接中
可靠传输

对于失序的报文段,没有明确的处理办法,具体看编程人员怎么处理。

累次确认

丢失重传

超时重传

ACK发送时机

快速重传

当连续接到3个重复的ACK(注意是不包括原数据的那个ACK),发送方马上重传。

选择确认 SACK

在双方赞同的情况下,可以使用SR协议。

如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。

往返时间的估计与超时 往返时间的估计

上一次估计值与本轮观测值的加权和

时间间隔设定多久为超时? 往返时间+安全边界值

karn算法

流量控制

通过接收方告诉发送方自己的窗口大小,让发送端设计合适的窗口大小来发送分组,保证速度匹配。

变量解释
  • rwnd:接收窗口,接收方设置,并发送给发送方让其进行维护
  • RcvBuffer:接收缓存,由接收方来维护
  • LastByteRead:主机B上的应用进程从缓存读出的数据流的最后一个字节的编号,即缓存中第一个数据字节编号-1
  • LastByteRcvd:从网络中到达的并且已放入主机B接收缓存中的数据流的最后一个字节的编号,即缓存中最后一个数据的字节编号
设置接收窗口
//接收窗口计算公式
spare room in buffer

= RcvWindow

= RcvBuffer-[LastByteRcvd - LastByteRead]

发送方维护一个接收窗口(变量),接收窗口用来告诉发送方接收方还有多少可用的缓存空间;当发送方知道接收方缓存空间用完时,即接收窗口为0,发送方就不发了。现在问题就来了,接收方会逐渐清理缓存,但发送方并不知道接收方什么时候清理,那样就会出现死锁状态

通过持续计时器打破死锁

发送方的接收窗口为0时,会启动持续计时器,计时器结束就会发送一个窗口探测报文段,接收方确认这个探测报文段时,就返回了它现在缓存空间的大小,如果还是0,那么重复执行这个 *** 作,直到不为0时,发送方就可以发送报文段了.

优化

只靠持续计时器,效率太低了,因此又加了两种方式来提高效率:

  • 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
  • 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(push) *** 作
拥塞控制

当出现以下两种情况时,一般认为发送了拥塞:

  • 超时
  • 连续接收三个重复的ACK
拥塞窗口

拥塞窗口指发送端在一个RTT内可以最多发送的数据包数

发送窗口

拥塞控制算法
  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复
慢开始算法

拥塞避免算法

慢开始与拥塞避免的搭配使用

快重传算法

发送方:

  • 只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段
  • 每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。

接收方:

  • 每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。
快恢复算法

快重传与快恢复算法的搭配使用

注意一点,计算机网络中,慢开始+拥塞避免是必须存在的,而快开始和快恢复是为了提高效率,有则更好。

BBR 拥塞算法

拥塞控制的两个不合理点:

  • 拥塞判断不够合理,公网上带宽不满也会丢包,并不一定是拥塞。
  • 填满才认为会发生丢包,太晚了。这样有可能会把缓存也填满。

TCP状态机

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5582687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存