全书基于一个简单场景:用户向浏览器输入一条URL到响应返回,一条网络请求的生命周期。
全书分六部分:
- 应用层客户端生成HTTP,委托给操作系统的协议栈
- 协议栈(TCP/IP模块)调用网卡驱动生成电信号
- 网卡如何通过路由器到达用于接入互联网的路由器
- 互联网内部接力传输
- 到达web服务器之后先通过防火墙的检查
- web服务器是如何收取数据的
第二章主要介绍,操作系统中的协议栈和网卡是如何将应用程序的消息发给服务器的:
- 创建套接字
- 连接服务器
- 收发数据
- 从服务器断开连接并删除套接字
- IP与以太网的包收发操作
- 用UDP收发数据的操作
本文介绍第五章节,IP与以太网的包收发操作。
0. 摘要
收发全流程:
接收:
网卡 --> 网卡驱动 --> TCP/IP协议栈
网卡结构:缓冲区 | MAC模块 | PHY(MAU)
1. PHY(MAU)接收电信号,转成通用格式转交给MAC模块
2. 信号的开头是报头,通过报头的波形同步时钟,遇到起始帧分界符后将后面的信号转成数字信号。
3. 到达信号的末尾检查FCS,校验失败则丢弃
4. 检查MAC地址是否一致,不一致则丢弃
5. 地址一致放入缓冲区,MAC模块工作完成
6. 网卡通知计算机收到一个包,通知机制--中断信号
7. 计算机收到中断信号调用中断处理程序
8. 中断处理程序调用网卡驱动
9. 网卡驱动会从缓冲区取出网络包,交给TCP/IP协议栈
10. 检查IP头部,确认格式是否正确。
11. 查看接收方IP地址是否与网卡IP一致,不一致通过ICMP消息将错误通知发送方
12. 如果IP一致根据头部的分片偏移量字段判断是否需要分片重组,至此IP模块结束了,接下来包会交给TCP模块。
13. TCP模块根据接收方IP、端口,发送方IP、端口查找对应的套接字。
14. 知道套接字,结合套接字和TCP头部的控制信息,执行相应的操作。
发送:
1. TCP模块创建TCP头部,委托给IP模块
2. IP模块创建IP头部,MAC头部
3. IP模块委托给网卡
4. 网卡将二进制流转成光电信号继续传输。
IP地址实际是分配给网卡的
MAC地址是网卡生产时写入ROM中的值
只要有接收方MAC地址,发送方MAC地址,以太网类型这三个特性就算是以太网
ARP协议的主要功能是将IP地址解析为MAC地址
路由表根据IP地址判断转发目标
1.什么是包
包是网络七层模型中网络层的传输数据单元,又称网络包。包结构:头部+数据。头部包含目的地址等控制信息,可以将头部理解为快递的面单,数据则是包裹中的货物
包传输流程:
- 发送方创建包,将包发往最近的网络转发设备。
- 转发设备会根据头部中的信息判断下一个转发设备。转发过程需要一张记录地址的表
- 经过多次转发到达接收方网络设备。
发送方和接收方统称终端节点,转发设备为中间节点。
创建包:生成具有正确控制信息(目的地址)的的头部,附上要发送的数据
网络设备中的表是什么?记录每个地址发送的方向,按照头部中的目的地址在表中查询。
TCP/IP包基于包发展而来,TCP/IP五层模型基于网络七层模型发展而来。
TCP/IP包封装了应用层,传输层,网络层,数据链路层。头部封装了网络层和数据链路层,数据封装了应用层和传输层。
举例:
数据链路层:以太网
网络层:IP(固定)
传输层:TCP(固定)
应用层:HTTP
TCP/IP包头部包含MAC头