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协议的交互,其中的重点就算窗口部分。