全书基于一个简单场景:用户向浏览器输入一条URL到响应返回,一条网络请求的生命周期。
全书分六部分:
- 应用层客户端生成HTTP,委托给操作系统的协议栈
- 协议栈(TCP/IP模块)调用网卡驱动生成电信号
- 网卡如何通过路由器到达用于接入互联网的路由器
- 互联网内部接力传输
- 到达web服务器之后先通过防火墙的检查
- web服务器是如何收取数据的
第二章主要介绍,操作系统中的协议栈和网卡是如何将应用程序的消息发给服务器的:
- 创建套接字
- 连接服务器
- 收发数据
- 从服务器断开连接并删除套接字
- IP与以太网的包收发操作
- 用UDP收发数据的操作
本文介绍第五章节,IP与以太网的包收发操作。
0. 摘要
IP地址实际是分配给网卡的
MAC地址是网卡生产时写入ROM中的值
只要有接收方MAC地址,发送方MAC地址,以太网类型这三个特性就算是以太网
ARP协议的主要功能是将IP地址解析为物理地址
路由表存储着指向特定网络地址的路径
1.什么是包
包是网络七层模型中网络层的传输数据单元,又称网络包。包结构:头部+数据。头部包含目的地址等控制信息,可以将头部理解为快递的面单,数据则是包裹中的货物
包传输流程:
- 发送方创建包,将包发往最近的网络转发设备。
- 转发设备会根据头部中的信息判断下一个转发设备。转发过程需要一张记录地址的表
- 经过多次转发到达接收方网络设备。
发送方和接收方统称终端节点,转发设备为中间节点。
创建包:生成具有正确控制信息(目的地址)的的头部,附上要发送的数据
网络设备中的表是什么?记录每个地址发送的方向,按照头部中的目的地址在表中查询。
TCP/IP包基于包发展而来,TCP/IP五层模型基于网络七层模型发展而来。
TCP/IP包封装了应用层,传输层,网络层,数据链路层。头部封装了网络层和数据链路层,数据封装了应用层和传输层。
举例:
数据链路层:以太网
网络层:IP(固定)
传输层:TCP(固定)
应用层:HTTP
TCP/IP包头部包含MAC头(用于以太网协议)和IP头(用于IP协议)。
TCP/IP网络中TCP/IP包传输的全过程:
- 发送方将目的IP写入IP头,IP协议根据这一地址找到下一个路由器的IP,IP协议根据下一路由的IP找到以太网地址,写入MAC头。
- 转发设备会根据头部中的信息判断下一个转发设备,转发的过程涉及路由表和以太网表。
- 最终TCP/IP包会到达目的地。
IP和以太网的分工原因:以太网可以替换成其他网络,比如无线局域网、FTTH等,将网络层和数据链路层分开,可以更好的根据需要使用各种通信技术。
2.包的收发操作概述
协议栈中的IP模块是如何完成收发操作的,对应包传输的第一步。
IP模块工作内容:
- 发送方TCP模块在数据块前加TCP头,传递给IP模块,这部分就是网络包的内容。
- IP模块收到委托后添加IP头和MAC头(IP头包含发往目的地所需的控制信息,MAC头包含通过以太网的局域网将包传输至最近路由器的控制信息),IP模块将TCP/IP包发给网卡,网卡将二进制流转成光电信号继续传输。
- 接收方网卡接收光电信号后转成数字信号传递给IP模块。IP模块解析IP头和MAC头后将数据(TCP头+数据)传给TCP模块。
- TCP模块解析TCP头将数据传给应用程序。
收发过程中的关键点:
TCP模块在收发数据时会分成好几个阶段,并为每个阶段设计对应功能的网络包(TCP三次握手,四次挥手等)。
IP包的收发操作都是相同的,对于IP模块而言TCP头部和数据都是二进制数据,收发时并不关心其中的内容。总之IP协议的职责就是打包数据,收发数据。
3.生成IP头部
IP头部格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
比较重要的三个字段:
Source Address 源地址,发送方IP.
Destination Address 目标地址,接收方IP.
Protocol 协议类型 6bit:表示包来自哪个协议的,TCP协议编号06(十六进制),UDP编号16(十六进制),协议编号详见 RFC790, ASSIGNED NUMBERS
IP地址实际是分配给网卡的,如果一台计算机有多块网卡,发送方IP怎么填呢?如何判断应该将包交给哪一个网卡呢?
通过路由表来判断。
查看路由表指令 route print
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.10 50
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331
127.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
192.168.0.0 255.255.255.0 在链路上 192.168.0.10 306
192.168.0.10 255.255.255.255 在链路上 192.168.0.10 306
192.168.0.255 255.255.255.255 在链路上 192.168.0.10 306
224.0.0.0 240.0.0.0 在链路上 127.0.0.1 331
224.0.0.0 240.0.0.0 在链路上 192.168.0.10 306
255.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
255.255.255.255 255.255.255.255 在链路上 192.168.0.10 306
===========================================================================
网络目标:网络包的最终目的
网关:转发路由器的IP。如果网关与接口相同,则直接向目标IP发送包。
接口:发送方IP
跃点数:传输成本,数字越小成本越低,每转发一次跃点数-1,跃点数变0后,传输失败。
网络目标和网络掩码都是 0.0.0.0
,表示默认网关。若发送方IP与其他网络目标不匹配,自动匹配这一行。
4. 生成以太网用的MAC头部
接收方IP表示包的最终目的地,若无匹配的网络目标,则走默认网关,目标MAC地址必须与网络目标相匹配。
MAC头部
接收方MAC地址 48bit
发送方MAC地址 48bit
以太类型 16bit
0000-05DC:IEEE 802.3
0800:IP协议
0806:ARP协议
86DD:IPv6
MAC地址是网卡生产时写入ROM中的值,设置发送方MAC只要将网卡中的MAC地址读出写入MAC头即可。
发送方MAC需要先通过路由表找到下一个转发设备的IP,然后根据IP地址查询MAC地址。
MAC地址:Media Access Control Address,也称为局域网地址(LAN Address),以太网地址(Ethernet Address)或物理地址(Physical Address),用于确认网络设备位置的位址
5. 通过ARP查询目标路由器的MAC地址
ARP:address resolution protocol, 地址解析协议。
ARP使用以太网的广播对所有设备提问:“这个XXX IP是你的吗?”,然后有人会回答:“这个是我的,我的MAC地址是XXX”。
ARP 也有缓存,可以使用命令 ARP -a
查看:
Internet 地址 物理地址 类型
192.168.0.1 70-af-6a-74-7b-c8 动态
192.168.0.7 24-05-0f-e6-8b-54 动态
192.168.0.255 ff-ff-ff-ff-ff-ff 静态
224.0.0.2 01-00-5e-00-00-02 静态
224.0.0.22 01-00-5e-00-00-16 静态
224.0.0.251 01-00-5e-00-00-fb 静态
224.0.0.252 01-00-5e-00-00-fc 静态
239.255.255.250 01-00-5e-7f-ff-fa 静态
255.255.255.255 ff-ff-ff-ff-ff-ff 静态
失效时间一般是几分钟,如果更改了 IP与MAC的对应关系,需要几分钟生效。
此时,IP模块得到了MAC地址,写入MAC头部交给网卡发送。如果网卡发送前数据已经打包好了,网卡就能适配各种类型的包。
经历了 TCP头 IP头 路由表 MAC头 ARP协议 ARP缓存,IP模块到此结束了。
接下来轮到网卡登场了。
6.以太网基础知识
介绍网卡之前先了解下以太网。
目前的以太网多采用交换机(交换式集线器)的模式,景观经历多次变更,只要有这三个特性就算是以太网:
- 接收方MAC地址
- 发送方MAC地址
- 以太网类型
以太网只关心包的收发,并不关心网络包的实际内容
7.将IP包转换成光电信号发送出去
IP包只是在内存中的一段数字信号,由网卡转换成光电信号。
网卡的大致结构:
- ROM:存放MAC地址的地方
- 缓冲区,临时存放网络包
- MAC模块,控制以太网收发操作的地方
- PHY(MAU),发送接收信号的地方
- RJ-45接口,连接网线的底座
MAC地址全球唯一,生产时写入。MAC地址会由网卡驱动从ROM中读出写入MAC模块。
8. 给网络包再加三个控制数据
网卡驱动获取包之后,会复制到网卡的缓冲中。MAC模块,从网卡缓冲区取出包,在开头加上报头和起始帧分界符,在末尾加FCS(帧校验序列)。
| 报头和起始帧分界符 | MAC头部 | IP头部 | TCP头部 | ------ 数据 ------| FCS |
| 网卡生产 | IP模块生产 | TCP生产 | 应用程序生产 | 网卡生产 |