IP 与以太网的包相关操作
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成包发送给通信对象。
基础知识【包】
包由头部和数据两部分组成。头部包含目的地址等控制信息;头部后面是委托方要发送给对方的数据。
数据发送
收到委托后,IP 模块会将包的内容当作一整块数据,在前面加上包含控制信息的头部。
- MAC 头部:以太网用的头部,包含 MAC 地址
- IP 头部:IP 用的头部,包含 IP 地址
封装完成的包会被交给网络硬件【以太网、无线局域网等】以电信号发送出去。
无论收发的包时控制包【仅包含控制信息】还是数据包,IP 对各种类型的包的手法操作都是相同的。
IP 头部
IP 地址这个概念针对的并不是计算机,而是网卡;如果一台计算机有多个网卡,那么这台计算机会有多个 IP 地址。因此,在填充发送方 IP 地址的时候,需要判断发送使用的是哪一张网卡。这个时候使用到的工具就是“路由表”;在 windows 环境下,可以使用 route print
命令来显示路由表的相关信息。
默认网关的目标地址和子网掩码都是 0.0.0.0
,如果其他条目都无法匹配,就会自动匹配这一行。
MAC 头部
MAC 头部信息用于协助以太网判断网络包目标地址。
ARP 查询 MAC 地址
在以太网中,可以利用广播把包发给连接在同一以太网中的所有设备。ARP 协议是广播的最佳实践,它通过向所有设备询问以获得目标 IP 的 MAC 地址。
同时 ARP 会使用缓存以减少不必要多的 ARP 包,一般在几分钟后就会进行一次清理,以免出现数据不一致的问题。在 windows 环境下,可以使用 arp -a
命令查看 ARP 的缓存数据。
基础知识【以太网】
以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,网络原型的发展如下图所示。
以太网具有的三个通用性质:
- 将包发送到接收方 MAC 地址代表的目的地
- 用发送方 MAC 地址识别发送方
- 用以太类型识别包的内容
IP 包转换成信号
IP 生成的网络包只是存放在内存中的一串数字信息,还需要将数字信息转换为电或光信号,才能在网线上传输。下图是关于收发包的网卡内部的抽象表现:
网卡的 ROM 中保存着全世界唯一的 MAC 地址,这是在生产网卡时写入的。网卡中保存的 MAC 地址会由网卡驱动程序读取并分配给 MAC 模块。
必要控制信息
网卡驱动从 IP 模块中获取包之后,会将其复制到网卡中的缓冲区内,然后 MAC 模块发送发送包的命令。
MAC 模块会将包从缓冲区取出,并在开头加上报文和起始分界符,在末尾加上用于检测错误的帧校验序列【FCS】。
- 报头是一串像 101010 这样 1 和 0 交替出现的比特序列,长度为 56 比特,用于确定包的读取时机。
- FCS 用于检查包传输过程中因噪声导致的波形紊乱、数据错误,通过某个公式对包中从头到尾的所有内容进行计算而得出来的。
网络包 -> 集线器
- 使用集线器的半双工模式
- 使用交换机的全双工模式
半双工模式:
- 为了避免信号碰撞,首先要判断网线中是否存在其他设备发送的信号
- MAC 模块从报头开始将数字信息按比特转换成电信号,然后由 PHY【物理层装置 Physical Layer Device】或者 MAU【介质连接单元 Medium Attachment Unit】的信号收发模块发送出去
- PHY(MAU) 模块会将信号转换为可在网线上传输的格式,并通过网线发送出去
UDP 协议
UDP 协议没有 TCP 的接收确认、窗口等机制,因此在收发数据之前也不需要交换控制信息,不需要建立和断开连接的步骤,只需要在应用获取的数据前加上 UDP 头部,然后交给 IP 进行发送就可以了。
UDP 头部
总结
学不会