目录
1.TCP/IP 网络模型
2.键入网址--->网页显示
2.1 生成HTTP数据包
2.2 DNS服务器进行域名与IP转换
2.3 建立TCP连接
2.4 生成IP头部和MAC头部
2.5 网卡、交换机、路由器
3 Linux系统收发网络包
1.TCP/IP 网络模型
首先,为什么要有 TCP/IP 网络模型?对于同一台设备上的进程间通信,有很多种方式;但对于不同设备上的进程间通信,就需要网络通信,而设备是多样的,要兼容不同的设备,就需要一套通用的网络协议,这个网络协议是分层的,TCP/IP 网络模型就是对每一层进行设计和介绍。
TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。
应用层的数据包会传给传输层,传输层是为应用层提供网络支持的。在传输层会有两个传输协议,分别是 TCP 和 UDP,要记住他俩都属于传输层协议。
TCP 的全称叫传输控制协议(Transmission Control Protocol),大部分应用使用的正是 TCP 传输层协议,比如 HTTP 应用层协议。
应用需要传输的数据可能会非常大,直接传输不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度),就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在 TCP 协议中,我们把每个分块称为一个 TCP 段(TCPSegment)。
当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用。
网络层负责实际的传输功能,最常用的网络层协议是IP协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过1500 字节就会再次进行分片,得到一个即将发送到网络的IP 报文。
网络层负责将数据从一个设备传输到另一个设备,那么不同设备之间如何寻找呢 ? 因此,网络层需要能区分设备的编号。我们一般用 IP 地址给设备进行编号,对于IPv4 协议,IP地址共 32 位,分成了四段(比如,192.168.100.1),每段是8位。只有一个单纯的IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道一个一个去匹配?这显然不科学。因此,需要将 IP 地址分成两种意义:一个是网络号,负责标识该IP地址是属于哪个的;一个是主机号,负责标识同一子网下的不同主机;配合子网掩码能算出 IP 地址的网络号和主机号。
IPv4地址和子网掩码_哔哩哔哩_bilibili
除了寻址能力,IP 协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,那么就会形成很多条网络的路,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。所以,IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地」选择路径。寻址更像在导航,路由更像在操作方向盘。
生成了 IP 头部之后,接下来要交给网络接口层,将来自网络层(IP层)的IP数据封装成适合物理网络传输的数据帧,即添加头部和尾部信息(如MAC地址、帧校验序列),然后交给物理硬件传输。解封装:接收物理网络的数据帧后,剥离帧的头部和尾部,提取IP数据报传递给上层(网络层)。网络接口层是TCP/IP模型的基石,确保数据能够跨越物理网络实现“最后一公里”的传输,是连接软件协议栈与硬件设备的桥梁。
- 传输层,给应用数据前面增加了 TCP 头
- 网络层,给 TCP 数据包前面增加了IP 头
- 网络接口层,给 IP 数据包前后分别增加了帧头和帧尾
网络接口层的传输单位是帧(frame),IP层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
这些新增的头部和尾部,都有各自的作用,也都是按照特定的协议格式填充,这每一层都增加了各自的协议头,那自然网络包的大小就增大了,但物理链路并不能传输任意大小的数据包,所以在以太网中,规定了最大传输单元(MTU)是 1500 字节,也就是规定了单次传输的最大IP 包大小。
当网络包超过 MTU 的大小,就会在网络层分片,以确保分片后的 IP 包不会超过 MTU 大小,如果 MTU越小,需要的分包就越多,那么网络吞吐能力就越差,相反的,如果 MTU 越大,需要的分包就越少,那么网络吞吐能力就越好。
2.键入网址--->网页显示
在浏览器输入URL回车之后发生了什么?_哔哩哔哩_bilibili
2.1 生成HTTP数据包
键入网址到网页显示,期间发生了什么?首先浏览器做的第一步工作就是要对 URL
进行解析,从而生成发送给 Web
服务器的请求信息。长长的 URL 实际上是请求服务器里的文件资源。当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是/index.html 或者 /default.html 这些文件,这样就不会发生混乱了。
对 URL进行解析后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。
2.2 DNS服务器进行域名与IP转换
首先我们要先学习DNS域名的解析:DNS域名解析过程_哔哩哔哩_bilibili
通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 web 服务器。但在发送之前,还有一项工作需要完成,那就是查询服务器域名对应的IP 地址,因为委托操作系统发送消息时,必须提供通信对象的IP 地址。有一种服务器就专门保存了 web服务器域名与 IP的对应关系,它就是 DNS服务器,其实DNS服务器就是一个数据库,里面记录了很多URL和对应的IP地址。
这个根是由一群服务器组成的,这群服务器用了13个不同的域名,这13个根域名服务器是由12个独立机构营运的,注意是13个域名不是13台机器。
当用户在浏览器中输入一个域名,比如www.example.com,客户端(如浏览器)会首先检查自己的缓存(还要检查本机缓存),看是否已经有该域名对应的 IP 地址记录。如果有缓存记录,就直接使用缓存中的 IP 地址进行连接,解析流程结束;如果没有,则会向本地配置的 DNS 服务器发送域名解析请求。如果你的主机里面DNS服务器设置错误就会存在可以登录QQ客户端但是不能浏览网页的情况,因为QQ客户端是直接用IP访问的。
这个DNS服务器一般会是最接近我们的本地DNS服务器,这台本地DNS服务器一般由ISP负责管理,ISP也就是互联网服务提供商(移动、电信)。本地 DNS 服务器接收到请求后,也会先检查自己的缓存。如果缓存中有该域名的记录,就直接将对应的 IP 地址返回给客户端。如果本地 DNS 服务器缓存中没有相关记录,它会根据配置的转发规则,将请求转发给其他 DNS 服务器,比如根 DNS 服务器或上级 DNS 服务器,进行进一步的查询。
2.3 建立TCP连接
2.2 键入网址到网页显示,期间发生了什么? | 小林coding
首先,源端口号和目标端口号是不可少的,如果没有这两个端口号,数据就不知道应该发给哪个应用。
接下来是包的序号,这个是为了解决包乱序的问题。还有应该有的是确认号,目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达这个是为了解决丢包的问题。
接下来还有一些状态位。例如SYN是发起一个连接,ACK是回复,RST是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。
还有一个重要的就是窗口大小。TCP 要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力,别发送的太快,撑死我,也别发的太慢,饿死我。除了做流量控制以外,TCP还会做拥塞控制,对于真正的通路堵车不堵车,它无能为力,唯一能做的就是控制自己,也即控制发送的速度。
2.4 生成IP头部和MAC头部
分别对应了网络层和网络接口层
2.5 网卡、交换机、路由器
网络包只是存放在主机内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信号转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。
负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序。网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
- 起始帧分界符是一个用来表示包起始位置的标记
- 末尾的 FCS(帧校验序列)用来检查包传输过程是否有损坏
交换机是将网络包原样转发到目的地。交换机工作在 MAC 层,也称为二层网络设备。那么交换机是如何接收包的呢?
首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号,然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。
计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址。
网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。不过在具体的操作过程上,路由器和交换机是有区别的:
- 路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址
- 而交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址
在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。
3 Linux系统收发网络包
2.3 Linux 系统是如何收发网络包的? | 小林coding