网络基础知识(五) Transport层详解

系列回顾

Transport Layer 传输层

传输层在整个网络模型中非常重要, 它对于很多网络可靠性的功能负责, 包括但不限于Multiplexing traffic和demultiplexing traffic.

简单来说, multiplexing 指的是, 一个网络节点能够传送数据到不同的接收端; demultiplexing 就是反过来.

Port 端口

传输层通过端口来处理multiplexing和demultiplexing. 端口是一个长度为16bit的数字, 用于指引数据包发送到节点中对应的服务. 举个例子, 当前有一个服务器A, 里面有一个API服务等待被请求, 这个API服务监听端口5000; 如果现在一个程序需要API返回数据, 那么这个请求的目标地址就是服务器A的IP地址, 目标端口就是5000. 如果说网络层满足了主机到主机之间的通信, 那么传输层满足了端口到端口的通信.

TCP Segment

在之前讲Ethernet Frame的时候踢到Ethernet Frame在payload封装了IP Datagram; 讲IP Datagram的时候提到了里面封装了TCP Segment.
TCP Segment 由两部分组成:

  • TCP 头
  • 数据

与底层一样, 数据部分封装了上层, 也就是应用层的数据. TCP头含有的字段如下图所示.

目标端口 和 发送端口

顾名思义, 目标端口和发送端口分别表示该数据包要去的地方和从哪个节点发出. 前文提到过, 一个端口的长度是16位的, 那么这两个字段的长度也就是16位的.

Sequence Number

这个字段的长度是32位, 用于表示该TCP片段位于整个数据包的哪一个位置. Ethernet Frame通常将数据包的大小限制在1518个bytes, 对于大于这个大小的数据包, TCP一般会拆分发送, 这个时候Sequence Number就排上用场了. 在接收端需要按照Sequence Number来组装数据包.

Acknowledgement Number

这个字段的长度是32位, 它的内容是下一个TCP包的序号. 举个简单的例子, 假设当前数据包的Sequence Number是1, Acknowledgement Number是2, 那么就表示, 当前的数据包序号是1, 下个数据包的序号是2.

Header Length

长度为4bit, 用于表示 TCP Header的长度.

Control Flag

这个字节的长度是6bit, 用于表示TCP的Control Flag. 至于Control Flag是什么, 后文会提到.

TCP window

TCP window是一个16bit长的字段, 里面表明了sequence number的范围

Checksum

Checksum同样是16-bit的长度. 原理和Ethernet Frame, IP Datagram的checksum字段一样. 用于验证数据的完整性.

Urgent Pointer

这个字段的长度是16-bit, 跟Control Flag一起配合使用个. 作用是用来跟接收端的设备表明, 此TCP数据包拥有最高优先级(比其他数据包都重要).

Options 和 Padding

一般来说不常使用, 个别情况下用于复杂的协议流程控制. Options + Padding的长度是32bit

Data payload

真正的TCP数据. 里面封装了Application层的数据.

TCP Control Flag

TCP Control Flag 用于TCP建立和关掉连接. TCP Control一共有6种.

  1. URG – urgent
    • 这个Flag表明这个TCP数据包比较重要, 关于这个数据包的更多信息在Urgent Pointer字段里显示
  2. ACK – acknowledge
    • 如果一个TCP数据包带有这个Flag, 代表这个数据包的Acknowledgement Number应该被验证.
  3. PSH – push
    • 带有这个字段的TCP数据包表示接收端设备应当将缓存数据发送到相应的程序当中.
  4. RST – reset
    • 带有这个Flag的数据包表示发送端或者接受端不能恢复丢失的TCP数据包或者恢复格式错误的数据包. 简单来说, 就是发送端或者接收端收到TCP数据后无法拼成一个”可以理解”的TCP数据包, 然后告诉对方, 把所有TCP数据包重新发送一遍.
  5. SYN – synchronize
    • 用于初次建立TCP连接时, 接收端知道要去验证sequence number字段.
  6. FIN – finish
    • 当有这个Flag的时候, 表明已经没有TCP数据包会被发送了. TCP连接可以关掉.

TCP建立连接的三次握手

要建立TCP连接, 设备A和设备B要进行3次握手. 假设设备A要和设备B建立TCP连接, 那么过程如下:

  1. 设备A: “我要和你建立TCP连接, 请检查我的sequence number, 然后我们知道这个TCP连接从哪开始”
    • 设备A发送包含SYN Flag的数据包给设备B
  2. 设备B: “好的, 我知道了, 我们开始连接吧, 我接受你的连接请求”
    • 设备B发送包含SYNACK的数据包给设备A
  3. 设备A: “我确认你发给我的确认信息, TCP连接建立成功”
    • 设备A发送包含ACK的数据包给设备B

TCP断开连接的四次挥手

当要断开当前TCP连接时, 设备A和设备B要进行四次挥手. 过程如下:

  1. 设备B: “我们断开吧”
    • 设备B发送包含FIN Flag的数据包给设备A
  2. 设备A: “断吧”
    • 设备A发送包含ACK Flag的数据包给设备B
  3. 设备A: “我也要断开”
    • 设备A发送包含FIN Flag的数据包给设备B
  4. 设备B: “确认你的断开”
    • 设备B发送包含ACK Flag的数据包给设备A