Computer Network

网络模型

TCP/IP

NetworkTCP/IPOSI

TCP/IP

TCP/IP 四层模型是实际互联网使用的网络分层架构,把网络通信拆成四层:网络接口层、网络层、传输层、应用层

从下往上:

1) 网络接口层:最底层,负责在物理网络上收发数据帧。以太网、Wi-Fi、PPP 这些协议都在这层。它把网络层的 IP 包封装成帧,通过 MAC 地址在局域网内寻址。

2) 网络层:核心是 IP 协议,负责数据包的路由和转发。通过 IP 地址实现跨网络的通信,路由器就工作在这一层,决定数据包走哪条路到达目的地。

3) 传输层:提供端到端的通信服务,管的是进程之间的通信。TCP 提供可靠传输,有连接、有确认、有重传。UDP 不管可靠性,发出去就完事,快但不保证到达。

4) 应用层:最上层,各种应用协议都在这里。HTTP 管网页、FTP 管文件传输、SMTP 管邮件、DNS 管域名解析。

总结

1)网络接口层:

  • 物理传输:包括电缆、光纤和无线传输介质。
  • 数据链路:采用协议如以太网协议(Ethernet),负责数据帧的编码、传输、接收和错误检测。

2)互联网层:

  • IP 地址:每台联网设备的唯一标识。IPv4 使用32位地址,IPv6 使用128位地址。
  • 路由:路由器通过路由表决定数据包的路径,确保数据包能够到达目标设备。
  • ICMP:用于发送错误消息和网络诊断(如 Ping 命令)。

3)传输层:

  • TCP:提供可靠、面向连接的通信,采用三次握手建立连接,使用序列号和确认机制确保数据完整性。
  • UDP:提供无连接的、不保证顺序的通信,常见于实时应用如视频流和在线游戏。

4)应用层:

  • HTTP:用于 Web 服务,客户端通过 HTTP 请求获取服务器上的资源。
  • FTP:用于文件传输,支持文件上传和下载。
  • SMTP:用于电子邮件的发送和接收。

各层的典型设备和协议

  1. 网络接口层的设备有网卡、交换机。网卡负责收发帧,交换机根据 MAC 地址表转发帧。

  2. 网络层的设备是路由器。路由器查路由表,决定数据包从哪个接口出去,往哪个下一跳转发。

  3. 传输层和应用层一般是软件实现,跑在操作系统和应用程序里。防火墙可以工作在各个层,七层防火墙能看到应用数据,做更细粒度的过滤。

img

为什么要分这么多层?

分层最大的好处是解耦。每层只管自己的事,通过标准接口跟上下层交互。换个网卡,只要还是以太网协议,上面的 IP、TCP、HTTP 都不用动。

各层独立演进,IPv4 升级到 IPv6,传输层和应用层不受影响。TCP 搞了个新的拥塞控制算法,应用层代码一行不用改。

出问题也好排查,ping 不通是网络层问题,连接建不起来是传输层问题,请求返回 500 是应用层问题。

各层的数据单位和包头信息

应用层:数据单位就叫数据。不同协议有不同的格式,HTTP 有请求行、请求头、请求体,DNS 有查询 ID、标志位、查询记录。

传输层:数据单位叫报文段。TCP 头部有源端口、目的端口、序列号、确认号、窗口大小、标志位。UDP 头部只有源端口、目的端口、长度、校验和,简单得多。

网络层:数据单位叫数据包。IP 头部有版本号、头部长度、服务类型、总长度、标识、标志、片偏移、TTL、协议、校验和、源 IP、目的 IP。

网络接口层:数据单位叫帧。以太网帧有目的 MAC、源 MAC、类型、数据、FCS。

发送数据时,从上往下一层一层加头部。应用层产生数据,传输层加上端口号变成报文段,网络层加上 IP 地址变成数据包,网络接口层加上 MAC 地址变成帧,最后变成比特流在物理介质上传输。

接收数据时,反过来一层一层拆头部。物理层收到比特流组装成帧,网络接口层拆掉帧头帧尾得到数据包,网络层拆掉 IP 头得到报文段,传输层拆掉 TCP/UDP 头得到应用数据。

为什么要 TCP,IP 层实现控制不行么?

链路层不可或缺,毕竟我们电脑都是通过链路相互连接的,然后 IP 充当了地址的功能,通过 IP 咱们找到了对方就可以进行通信了。

理论上并不需要 TCP 层,IP 层就可以实现控制

但是 IP 层涉及到的设备更多,一条数据在网络上传输需要经过很多设备,设备之间都需要靠 IP 来寻址。假设在IP层实现控制,是不是没传输一次就得保证传输成功,并且还得有重传,流量控制,拥塞控制等逻辑。那这样传输的效率是不是低了很多?因为在之前都是tcp保证数据有序, 不丢失,进行流量控制和拥塞控制。然后ip只管加上ip头传数据就完事了,即便丢了tcp也有快速重传,快速恢复等机制。但现在tcp没了,但这些必要的功能是不是也得有?那ip在传之前就得保证数据可靠性等。以前啥也不管直接传,现在要管着管那,好了才能穿,性能是不是就下来了

端到端原则

这背后其实是网络设计的一个核心原则:端到端原则

这个原则是说,如果一个功能可以在端点(发送方和接收方)完整实现,就不要把它放到网络中间。

拿重传来说,如果 IP 层实现了重传,每个路由器都得有重传逻辑,A 发给 B,B 丢了重传给 C,C 丢了再重传给 D,问题是 D 最终收没收到,A 其实还是不知道。就算中间每一跳都重传成功了,端到端的可靠性依然没法保证。

既然端到端的可靠性必须由端点来保证,那中间节点做重传就是多此一举,还增加了复杂度。

所以最优解就是:中间网络只管尽力投递,投丢了就丢了,让端点来处理重传。TCP 正是基于这个思想设计的。

IP层的设计哲学

因此IP 层被设计成"尽力而为"的服务,不保证送达、不保证顺序、不保证不重复。这看起来很"弱",但其实是故意的。

互联网上有几十亿台设备,中间的路由器要处理海量流量。如果每个路由器都要维护每个连接的状态,比如序列号、窗口大小、超时计时器,那路由器的内存和 CPU 根本扛不住。

现在的核心路由器每秒要转发几十亿个包,它们能做到这个速度,就是因为只看目的 IP 然后转发,不需要维护任何状态,这叫"无状态转发"。

把状态维护的活儿交给端点,路由器只干转发这一件事,整个网络才能 scale 到今天这个规模。

因此如今的设计,TCP发送方负责管理数据的有序性,可靠性。而IP层只管传数据。两者功能解耦,各司其职,才使得如今的网络传输能做到这样

既然端到端原则这么好,为什么现在又有人在网络中间加各种功能,比如 NAT、防火墙、CDN?

端到端原则是理想情况,现实中有很多妥协。NAT 是因为 IPv4 地址不够用,不得不在中间做地址转换。防火墙是安全需求,必须在边界过滤流量。CDN 是性能优化,把内容推到离用户近的地方。这些都违背了端到端原则,但解决了实际问题。不过代价也有,NAT 让 P2P 应用变复杂了,防火墙经常误杀正常流量,CDN 带来了缓存一致性问题。

QUIC 协议把可靠传输从 TCP 挪到了应用层,这和你说的分层设计矛盾吗?

不矛盾,反而是分层思想的延续。QUIC 的动机是 TCP 在内核里改不动,历史包袱太重。把可靠传输搬到应用层,迭代速度快了 100 倍,Google 想改算法更新个 Chrome 就行。本质上还是端到端原则,IP 层依然只管转发,可靠性还是在端点实现。只不过以前端点的实现在内核 TCP,现在挪到用户态 QUIC 了。分层的边界可以调整,核心原则没变。

ARP 协议属于哪一层?

这个有争议。ARP 的作用是把 IP 地址解析成 MAC 地址,从功能上看像是网络层的协议,因为它处理 IP 地址。但 ARP 报文直接封装在以太网帧里,不走 IP 协议,从封装关系看又像是网络接口层的。一般说法是 ARP 处于网络层和网络接口层之间,是个胶水协议。


OSI七层模型

OSI 七层模型是国际标准化组织搞的一个网络通信分层框架,把网络通信拆成七层,每层只管自己的事,通过接口跟上下层打交道

从下往上依次是:

1) 物理层:最底层,管的是比特流怎么在物理介质上传输。网线、光纤、无线电波这些都是物理层的东西。

2) 数据链路层:把比特流组织成帧,用 MAC 地址在局域网内寻址,还负责差错检测。以太网、PPP 协议在这层。

3) 网络层:管的是跨网络的数据传输,用 IP 地址寻址,负责路由选择。IP 协议、ICMP 协议在这层。

4) 传输层:提供端到端的通信,管的是进程级别的通信。TCP 提供可靠传输,UDP 提供快速但不保证可靠的传输。

5) 会话层:管理通信会话的建立、维护和终止。NetBIOS、RPC 这些在这层。

6) 表示层:管数据格式转换、加密解密、压缩解压。JPEG、MPEG、SSL/TLS 的加密功能在这层。

7) 应用层:最上层,直接跟用户打交道。HTTP、FTP、SMTP、DNS 这些都是应用层协议。

数据封装过程

数据从应用层往下走,每经过一层就加一个头部,这个过程叫封装。

应用层产生数据,传输层加上 TCP/UDP 头变成段,网络层加上 IP 头变成包,数据链路层加上帧头帧尾变成帧,物理层把帧变成比特流发出去。

接收方反过来,从下往上一层一层拆头部,最后还原成应用数据。

交换机工作在第几层?路由器呢?

传统交换机工作在第二层数据链路层,根据 MAC 地址转发帧。路由器工作在第三层网络层,根据 IP 地址转发包。不过现在有三层交换机,既能做二层交换也能做三层路由,看配置。

post.comments