[网络编程] TCP/IP 模型概览

1. TCP/IP 五层网络模型

TCP/IP 是利用 IP 进行通信时所必须用到的协议群的总称。

1.1 网络通信五元组

网络通信五元组即源IP,源端口号,目的IP,目的端口号,协议(UDP、TCP),通过这五个元素,就可以在网络中精准识别并定位一个通信。相应地,这五元组中任何一个元素不同都不能说是同一个通信。比如,源IP、源端口号、目的IP、目的端口号都相同,但使用了不同传输层协议,这也是不同的通信。


1.2 模型详解

物理层

负责规范光信号或电信号的传递方式,也就是为数据链路层提供一个规范的物理连接。比如规定以太网通用的网线为双绞线,规定 WiFi 电磁波传输过程的工作特性,规定传送信号的电压等。物理层可以决定数据的最大传输速率、传输距离、抗干扰性等。

在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,单位是 bit 比特。集线器(Hub)工作在物理层。

数据链路层

在物理层提供比特流服务的基础上,建立相邻结点 之间的数据链路,通过差错控制提供数据帧(Frame)在信道(包括有线信道和无线信道)上的可靠传输。帧是一种可被物理层传输的、用来移动数据的结构包。它不仅包括原始数据,还包括发送方和接收方的 MAC 地址以及检错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。 如果在传送数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。

刚刚提到的交换机就工作在数据链路层,因为它们要对帧解码并根据 MAC 地址将数据发送到正确的接收方。

网络层

网络层通过综合考虑发送优先权、网络拥挤程度、服务质量以及可选路由的花费来决定不同网段中两个节点进行数据传输的最佳路径。网络层只是在指引数据的发送,它必须依赖于端端之间的由数据链路层提供的可靠传输服务。网络层最常见的协议就是 IP 协议,路由器自然也就工作在网络层,因为它连接了不同网段,通过解析 IP 地址来指引数据的传送。

网络层是可选的,它只用于两台网络设备处于不同网段的情况,而当两台主机处于同一个 LAN 网段下时,它们之间使用物理层和数据链路层通信即可。

传输层

传输层针对两个任意网络设备,不考虑任何中间过程,只是一种端对端的通信约定

最常见的两个传输层协议分别是 TCP 和 UDP,TCP 和 UDP 在 OS 内核中是完全独立的两个软件模块。

TCP 是面向连接的、可靠的流协议。当应用程序采用 TCP 发送消息时,可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 通过顺序控制、重发控制、流量控制、拥塞控制等机制,尽量保证数据的可靠性传输,感知数据是否丢失。TCP 是面向连接的,只有在确认通信对端存在时才会发送数据,因此可以提高网络利用率。

UDP 是不具有可靠性的数据报协议。当应用程序采用 UDP 发送消息时,可以确保发送消息的大小,因为 UDP 面向数据报,一次只能读写一个完整的数据报,但不能保证消息一定能被读取到。UDP 也不会对数据是否到达进行检查,也不保证到达顺序。对数据可靠性的处理会被移交至上层的应用去完成,比如,应用有时会根据自己的需要进行重发处理。UDP 主要用于对高速传输和实时性有较高要求的通信或广播通信。

应用层

如果说前面的所有层都是在千辛万苦地路由跨网一步步地传送,为了将数据准确无误地传送到某个主机的某个进程上,那么应用层就是在拿到数据之后,规定数据的加工、处理、使用方式。我们的网络编程主要就是在和应用层打交道。

常见的应用层协议包括 HTTP(超文本传输)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远程登陆)、DNS(域名解析)等等。

1.3 从生活中理解 TCP/IP 模型

比如,我想在淘宝买一件衣服,我只需要考虑这件衣服合不合身,而不需要关心这件衣服会怎么到我手中,我只关心到我手中后我拿它怎么办,这就是应用层。

我下单了,我要提供收件人信息,卖家也会提供寄件人信息,一起上交给物流公司,这实际上就是传输层通过网络通信五元组确定一个通信,是一种约定。

物流公司拿到信息了,它得看看走什么路线省钱。这就是网络层考虑的问题,路径规划。

现在,明确了路径,物流公司可以分配快递人员了,也就是网络层把数据包下传给网卡。快递小哥拿到信息,看看自己负责的这一段路线,OK,可以上路了。但是,选什么交通工具呢?那得看要走的是什么路,距离多少,限速多少。谁来给出明确规定?那就是物理层了。

注意,道路本身,也就是我们的硬件设备,比如双绞线、光纤等,它们不是物理层,而是第 0 层,物理层是对它们的规范。终于,快递小哥选择了小货车,踩油门,向前驶去...... 也就是我们的网卡终于把二进制数据转化为光电信号传播出去了。

2. 网络通信的基本流程

TCP/IP 模型的每个分层都会为所发送的数据添加一个首部,首部中包含了该层必要的信息。每一层从上一层收到的包(数据 + 首部)全部都被认为是本层的数据。

  1. 应用程序获取用户输入后,会构造一个遵守应用层协议的数据包,这里的应用层协议是该程序的开发者定义的,通常是一种 "结构化数据",即以约定的格式对用户发送的数据进行字符串拼接。

  2. 应用程序调用传输层提供的 socket API,将数据包交给传输层。传输层拿到的数据包对于该层来说即是数据,传输层在数据前添加 TCP 首部。

  3. 传输层调用网络层 API,将数据包交给网络层。网络层在 TCP 首部前加上 IP 首部。IP 数据包通过路由控制表决定接受此 IP 包的路由或主机。

  4. 网络层继续将数据包交给数据链路层,数据链路层根据以太网协议为数据附加以太网首部和尾部。

  5. 以太网数据包继续被传递给物理层,硬件设备(网卡)会将二进制数据转化为光电信号传播出去。

  1. 另一台主机收到以太网包后,会从包首中解析 MAC 地址,若是发给自己的包则接收,不是则丢弃。若接收数据,则将继续从包首中确定数据类型,传给相应的网络层模块,如 IP。

  2. 网络层继续从 IP 包首部中解析 IP 地址,并通过路由表,在查明应该送往的主机或路由器之后进行转发数据,根据首部的协议类型将数据发送给对应的模块,如 TCP。

  3. 传输层中的 TCP 协议会检查数据的完整度和发送顺序,并根据端口号传给某个具体的应用程序。

  4. 应用程序直接接收传输层传来的数据,通过程序开发者定义的数据解析方式,展示相应的内容。

相关推荐
RisunJan1 小时前
Linux命令-fping命令(网络诊断工具)
linux·网络
遇到困难睡大觉哈哈1 小时前
Harmony os LazyForEach:数据懒加载详解
服务器·网络·windows·harmonyos·鸿蒙
Dest1ny-安全1 小时前
CTF入门:国内线上CTF比赛时间及部分题目资源
网络·安全·web安全·微信小程序·php
在路上看风景1 小时前
7.2 认证和报文的完整性
网络
sonadorje1 小时前
HTTP Cookie解析
网络·网络协议·http
w***48821 小时前
【MySQL】视图、用户和权限管理
android·网络·mysql
007php0072 小时前
nginx加速缓存导致Event-Stream消息延迟问题的解决方案
运维·网络·数据库·nginx·缓存·面试·职场和发展
Evan芙2 小时前
OpenEuler系统网卡地址定制
运维·服务器·网络
拾忆,想起2 小时前
Dubbo序列化方式全解析:从原理到实战的性能优化指南
服务器·网络·微服务·性能优化·架构·dubbo