skaiuijing

经典的OSI七层分层如下,该七层结构是由国际协定的,实际使用中并不存在该结构,该分层只是为了便于理解网路协议:

1
2
3
4
5
6
7
8
9
10
graph LR

Aa(OSI七层模型)
Ab(应用层)-->Ha(应用程序的各种服务)-->Hb(确保网络应用的使用)
Ac(表示层)-->Ga(数据编码及转换和加密)-->Gb(确保数据的解析)
Ad(会话层)-->Fa(创建并管理和维护会话)-->Fb(确保双方数据交流正常)
Ae(传输层)-->Ea(提供可靠的协议稳定传输数据)-->Eb(确保数据能完整送到目标地址)
Af(网络层)-->Da(管理IP地址)-->Db(负责数据路由)-->Dc(确保数据能送到目标地址)
Ag(数据链路层)-->Ca(接收数据并封装为帧)-->Cb(通过各种控制协议管理链路)-->Cc(确保链路连接正确)
As(物理层)-->Ba(物理线路的链接)-->Bc(屏蔽物理介质与设备的差异)-->Bd(确保物理连接)

真正被实现的网络协议是TCP/IP四层协议:

1
2
3
4
5
6
graph LR
Sa(TCP/IP四层协议)
Aa(应用层)-->Ab(各种应用层协议FTP,HTTP,DNS,SMTP等)-->Bd(数据段)
Ba(运输层)-->Bb(TCP与UDP协议)-->Bc(数据包)
Ca(国际层IP)-->Cb(IPv4或IPv6,ICMP)-->CC(数据帧)
Da(网络接口层)-->Db(物理接口:以太网,令牌环网,ARP,PPP)-->Dc(数据位/bit)

数据链路层被合并为了网络接口层,网络层变成了IP层,传输层不变,但是表示层、会话层都被合并到了应用层。

对于TCP/IP四层,自底向上的实现如下:

1
2
3
4
5
graph LR
Sa(网络接口层)-->Aa(以太网收发)-->Ab(ARP实现)
Sb(国际IP层)-->Ac(IP协议实现)-->Ad(ping响应)
Sc(运输层)-->Ae(UDP实现)-->Af(TCP实现)
Sf(应用层)-->Ba(HTTP实现)-->Bb(应用层实现,如网页)

分层结构中的复用

对于设计者来说,实际上的分层可能并不是严格遵守的,例如:许多协议栈往往会直接在tcp/udp的输出操作中设置ip。毕竟对于一个数据报,频繁的操作是非常耗费性能的,如果每到一层就重新拷贝一次,程序的性能会非常不理想。

所以,许多协议栈通常的做法是将输入与输出分离,但由buf贯穿全文。

好了,相信读者已经知道什么是TCP/IP协议了,那让我们稍微加快一点进度,进入TCP吧。

笔者更倾向于从设计的角度看待这些协议栈。

参考RFC9293

TCP协议

作为一种全双工通信协议,TCP是比较复杂的,但却至关重要,甚至可以称之为TCP/IP协议的精髓。

按照习惯,4字节为一行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Rsrvd |W|C|R|C|S|S|Y|I| Window |
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Options] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :
: Data :
: |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

首部就不必赘述了,我们重点关注的是TCP协议的交互,其中的重点就算窗口部分。