1. 概述

1.1 传输层的意义

网络层可以把数据从一个主机传送到另一个主机,但是没有和进程建立联系。
传输层就是讲进程和收到的数据联系到一起,使数据能够为应用服务
所以说传输层是主机才有的层次
在这里插入图片描述

1.2 传输层的两个协议

在这里插入图片描述

1.3 传输层的寻址和端口

端口号只用于计算机分辨本地进程,总共有 2^16=65536 种端口号,端口号有很多种,不能随便使用
在这里插入图片描述

1.3.1 常见的应用程序端口号

在这里插入图片描述

2. UDP 协议

2.1 UDP 概述

注释:
因为 UDP 一次发送一个完整报文不会分片,所以需要应用层传输过来的数据不要太大,否则网络层分片任务就很重,但是也不能太小,不然效率较低
UDP 适合一些实时应用,因为实时应用延迟要求高,需要立即响应
在这里插入图片描述

2.2 UDP 首部格式

在这里插入图片描述

2.2.1 UDP 的校验位构成

这里的伪首部只是用来计算检验和的,计算完了就丢弃,可以见下 UDP 的校验方式
在这里插入图片描述

2.2.2 UDP 校验方式

总结一下步骤:

在发送端的时候:

1.就是将每一行(4 字节)拆成两部分,左右平均 2 字节大小,将这两字节数据写成二进制,那么 2 字节一共就需要 2*8=16 位。此时检验和没有计算,默认填充 0,同时如果数据字段不整齐,则用 0 补齐,这样就可以写出几十行二进制数,如图中方所示 2.计算着几十行二进制数按二进制反码运算求和,二进制反码运算可以参考
二进制反码求和运算
得到的最后简介再反码,之后将反码之后的放入原来的检验和字段

接收端的时候

与发送端的时候不同的是,此时检验和字段不是 0 了
按照发送端的步骤再将所有数据写成二进制进行二进制反码运算求和
如果最后得到结果全 1 就是没问题,否则丢弃
在这里插入图片描述

3. TCP 协议

3.1 TCP 协议的特点

TCP 必须要建立连接之后才可以进行数据交换,所以 TCP 是面向连接的
在这里插入图片描述
TCP 传输数据是随机切割数据的在这里插入图片描述

3.2 TCP 报文段的首部

注释:
见上图,可以看到 TCP 是将数据随机分割后加上 TCP 头传输的,所以
序号就是为了标记这些随机分割之后的数据,这里把第一个字节的编号当成序号
确认号就是收到之后做一下标记,代表这之前的都收到了,希望收到的下一个编号的数据就是确认号打头的那个数据
偏移量就是为了标记一下距离 TCP 开始多少字节是数据,这里的单位是 4B,这个偏移量就是 TCP 首部长度
在这里插入图片描述
窗口就是接收方告诉发送方,还有多少地方(缓存)可以放数据
紧急指针就是告诉 TCP 从哪里到哪里是紧急数据
在这里插入图片描述

3.2.1 TCP 的六个控制位

紧急位 URG

URG 的特点就是让数据插队,URG=1 的就会在缓存中被提前到第一个传输
在这里插入图片描述
在这里插入图片描述

确认位 ACK

在这里插入图片描述

推送为 PSH

就是接收端的 URG,将 PSH=1 的数据尽快接收
注意一下,如果没有 PSH,一般都是接收方缓存满了之后再将数据发送到主机
在这里插入图片描述

复位 RST

在这里插入图片描述

同步位 SYN

A 和 B 主机要建立连接,就 A 先发一个报文,其中 SYN=1
B 收到之后也回复一个 SYN=1 的报文,代表接受连接
在这里插入图片描述

终止位 FIN

在这里插入图片描述

3.3 TCP 连接管理

3.3.1 TCP 三次握手(建立连接)

注释:
第一段的意思是
SYN=1:(A)要建立连接了!
seq=x(随机):因为还没有数据,所以写什么都无所谓

第二段的意思是
SYN=1:我(B)同意你(A)建立连接!
ACK=1:连接建立了,之后的 ACK 必须都置为 1
seq=y(随机):因为还没有数据,所以写什么都无所谓
ack=x+1:之前发送方(A)说发送的是第 x 位数据(虽然发送方是瞎说的),所以我(B)要的是 x+1 位数据

第三段的意思是
SYN=0:SYN 只有在建立连接时才为 1,其他时候均设为 0
ACK=1:连接建立了,之后的 ACK 必须都置为 1
seq=x+1:我(A)发送的报文段的第一个字节就是 x+1
ack=y+1:之前接收方(B)说发送的是第 y 位数据(虽然接收方是瞎说的),所以我(A)要的是 y+1 位数据

注意一下,TCP 是双向的,所以不存在绝对不变的发送方接收方,这里的两台主机都同时是发送方和接收方
在这里插入图片描述

TCP 三次握手特定导致的 SYN 洪泛攻击

在这里插入图片描述

3.3.2 TCP 四次挥手(连接释放)

注释:
第一段的意思是
FIN=1:(A)要释放连接了!
seq=u:发了好多数据,这里只是用 u 指代一下,这里 u 是有确定值的

第二段的意思是
ACK=1:连接建立了,之后的 ACK 必须都置为 1
seq=v:发了好多数据,这里只是用 v 指代一下,这里 v 是有确定值的
ack=u+1:之前发送方(A)说发送的是第 u 位数据,所以我(B)要的是 u+1 位数据(尽管此时 A 已经决定释放连接了)

第三段的意思是
FIN=1:(B)要释放连接了!
ACK=1:连接建立了,之后的 ACK 必须都置为 1
seq=w:发了好多数据,这里只是用 w 指代一下,这里 w 是有确定值的
ack=u+1:之前发送方(A)说发送的是第 u 位数据,所以我(B)要的是 u+1 位数据(因为 A 直接不发数据了,所以第二段第三段的 ack 都是 u+1)

第四段的意思是
ACK=1:连接建立了,之后的 ACK 必须都置为 1
seq=u+1:之前发的数据时第 u 位数据,B 也要第 u+1 位数据,所以我发第 u+1 位数据
ack=w+1:之前发送方(B)说发送的是第 w 位数据,所以我(A)要的是 w+1 位数据

为什么需要等待计时 2MSL?
因为这样可以保证 B 可以收到 A 的终止报文段进而进入关闭状态
比如说如果 A 的第四段报文丢失,那么等待一个 MSL 之后 B 就会重传第三段报文,花费小于 1MSL 之后 A 就会再收到第三段报文,之后就可以再次向 B 发送第四段报文提示 B 关闭连接
在这里插入图片描述

3.4 TCP 可靠传输

TCP 是提供可靠传输,UDP 这种本身还是不可靠传输的就再靠应用层解决了
在这里插入图片描述

3.4.1 序号

就是 TCP 根据下方数据链路层的 MTU(最大传输单元)来随即将数据切割成好几端并且进行编号
在这里插入图片描述

3.4.2 确认

发送方每一次发送数据之后都需要接收方进行确认。
TCP 使用的是累计确认机制,就是从第一个丢失的字节开始请求丢失的报文段。如图中 456 丢失,78 到达,但仍然请求发送的数据序号是 4
在这里插入图片描述

3.4.3 重传

为什么要使用自适应算法?网络环境太复杂,路径又长又短,RTT 设置短了照顾不了距离远的,RTT 设置长了又导致网络利用率降低,所以使用 RTTs

在这里插入图片描述

3.5 TCP 流量控制

简单来说就是接收方可以动态的发送信息告诉发送方发送窗口的大小。
接收方接受不过来了就让发送方发送窗口小点,这样发送方发送的速率就慢下来了,接收方就有时间处理它的数据了
接受方处理完了也可以发送请求让发送方发送窗口大点,这样发送方发送的速率就快起来了,接收方就可以处理更多数据而不是空闲等着收数据了
在这里插入图片描述

3.5.1 计时器

在本例子中,使用的累计确认机制(一次回复收到 ack=201)和三次流量控制机制。
但是有一个情况就是,如果最后 B 不允许 A 再发送数据了,B 在处理完数据之后想要恢复窗口大小时发送的有 rwnd 大小的数据报丢了怎么办?此时 A 有 B 的指令在前,发送窗口为 0 无法发送数据,B 也在等待 A 回复,造成了类似死锁的现象
解决方法:使用计时器
在这里插入图片描述

3.6 TCP 拥塞控制

流量控制是对单独一个来说的,拥塞控制是一群
在这里插入图片描述

3.6.1 拥塞控制四种算法

这里虽然是四种算法,但是通常是两两结合进行使用
在这里插入图片描述

3.6.2 慢开始和拥塞避免

这里开始时以指数形式增长,ssthresh 的意思是慢开始门限,代表从这个地方注入的报文段就比较多了,需要开始慢速增加了。
之后一段都是线性增长,每次增加 1,直至达到网络拥塞状态
瞬间将 cwnd 设置为 1,同时调整原来的 ssthresh 的值到之前达到网络拥塞状态的 1/2,(这里是 24 降到 12)
重复以上步骤,但是注意此时 ssthresh 变了之后线性增长的转折点也变了
在这里插入图片描述

3.6.3 快重传和快恢复

这里和上面的慢开始和拥塞避免的一开始步骤差不多,都是先指数增长再转变为线性增长。
不同的点是快重传和快恢复算法是在收到连续的 ack 确认之后执行,这里的 ack 就是冗余 ack,冗余 ack 的特点是如果多次对某一段请求的数据没有被收到,达到一定数目之后就会立即执行重传。但是此时只是降到现在 cwnd 的一半,再重新线性增长。而不是像慢开始和拥塞避免的从头开始
在这里插入图片描述

4. 本章思维导图

在这里插入图片描述

本文常用名词中英文对照

Multiplexing and demultiplexing 复用与分用
Positive acknowledgments 肯定确认
Negative acknowledgments 否定确认
Countdown timer (倒数)计时器
Cumulative acknowledgment 累积确认
Receive buffer 接收缓冲区,或接收缓存
Resource-management cells 资源管理单元
Source (port number) 源端口号
Destination (port number) 目的端口号
Checksum 校验和
Pipelined protocols 流水线(型)协议
Go-back-N 回退 N
Selective Repeat 选择重传
Timeout (定时器)超时
Fast Retransmit 快速重传
Flow Control 流量控制
Three way handshake 三次握手
sequence number 序列号(简写为 seq)
acknowledgement number 确认号(简写为 ack;注意与大小的 ACK 不同)
Congestion Control 拥塞控制
additive increase, multiplicative decrease 加性增乘性减
Slow Start 慢启动
congestion-avoidance 拥塞避免
fast recovery 快速恢复
duplicate (ACK) 冗余(ACK)
Random Early Detection 随机早期检测

掘金:前端 LeBron

知乎:前端 LeBron

持续分享技术博文,关注微信公众号 👇🏻

img