2.5.1 包的基本知识
- 首先,包由头部和数据两部分构成,头部包含目的地址等控制信息。
- 一个完整的包包括MAC头部、IP头部、TCP头部、数据块。
- 转发设备根绝头部的目的地址等控制信息判断接下来发送到哪里。
- 路由器是按照IP规则传输包的设备,集线器、交换机是按照以太网规则传输包的设备。
- MAC头部用于以太网协议,IP头部用于IP协议。
- IP协议先根据IP头部找到下一个路由器的位置,然后IP协议会查找下一个路由器的MAC地址,并将这个地址写入MAC头部(这样以太网协议就知道包要发送到哪个路由器了),再委托以太网协议传输包。
- 所以在每个路由器收到包的时候,MAC头部会先被舍弃,然后再次发送的时候又会加上包含新MAC地址的新MAC头部。
- 以太网协议层可以被替换成无线局域网、ADSL、FTTH等,它们都可以帮助IP协议来传输网络包,因此将IP和负责传输的网络分开,可以更好地根据需要使用各种通信技术。
2.5.2 包收发操作概览:IP模块
- TCP模块将TCP头部和数据块的整体交给IP模块后,IP模块负责添加IP头部和MAC头部。
- IP模块将封装好的包交给网络硬件,这里统称为网卡。
- 网卡将这一串由0和1组成的数字信息转换为电或光信号发送出去。
- 无论要收发的包是控制包还是数据包,IP对各种类型的包的收发操作都是相同的。
2.5.3 生成包含接收方IP地址的IP头部
- IP包头部最重要的内容就是IP地址,IP地址是由TCP模块告知的。
- IP头部字段:版本号、头部长度、服务类型、总长度、ID号、标志、分片偏移量、生存时间、协议号、头部校验和、发送方IP地址、接收方IP地址、可选字段
- IP表也叫路由表,通过route print命令查看。
2.5.4 生成以太网用的MAC头部
- MAC头部字段:接收方MAC地址、发送方MAC地址、以太类型。
- IP模块在生成IP头部之后,会在它前面再加上MAC头部。
- IP模块根据路由表gateway栏的内容判断应该把包发送给谁。
2.5.5 通过ARP查询目标路由器的MAC地址
- ARP:Address Resolution Protocol,地址解析协议。
- 利用ARP对子网内所有设备发送广播询问目标IP地址是谁的,请求返回对方的MAC地址。
- ARP利用缓存减少ARP查询次数,缓存过期时间只有几分钟。
2.5.6 以太网的基本知识
- 以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术
- 以太网的三个基本性质:将包发送到MAC头部的接收方MAC地址代表的目的地,用发送方MAC地址识别发送方,用以太类型识别包的内容。
2.5.7 将IP包转换成电或光信号发送出去
- 网卡驱动程序在计算机开机的时候对硬件进行初始化操作,包括硬件错误检查、设置MAC地址等步骤。
- 网卡的ROM保存着全世界唯一的MAC地址,这是在生产网卡时写入的,这个地址由网卡驱动程序读取并分配给MAC模块。
- 网卡主要包括:缓冲区、MAC、PHY(MAU)、RJ-45接口、ROM等结构。
2.5.8 给网络包再加3个控制数据
- 首先,网卡的MAC模块会将包从缓冲区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列FCS。
- 报头是一串像101010...这样1和0交替出现的比特序列,长度为56比特,它的作用是确定包的读取时机。
- 起始帧分解符的末尾比特排列有少许变化,接收方以这一变化作为标记,从这里开始提取网络包数据。
- 末尾的FCS,用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串32比特的序列,通过一个公式对包中从头到尾的所有内容进行计算得来。
2.5.9 向集线器发送网络包
- 网卡的MAC模块生成通用信号,然后由PHY(MAU)模块转换成可在网线中传输的格式,并通过网线发送出去。
- 发送和接收同时进行的方式叫做全双工,相对地,某一时刻只能进行发送或接收其中一种操作的叫作半双工。
- 集线器是半双工模式,如果同时有收发操作,两组信号就会相互叠加,无法彼此区分出来,这就是所谓的信号碰撞。当发生碰撞时,发送操作会终止,等待重新发送。
2.5.10 接收返回包
- 首先PHY(MAU)模块会将信号转换成通用格式并发送给MAC模块。
- MAC模块再从头开始讲信号转换成数字信息并存放到缓冲区中。当到达信号的末尾时,还需要检查FCS。接下来MAC模块会检测接收方MAC地址是否和自己的地址一致。
- 接下来,网卡会通过中断机制通知计算机收到了一个包。
- 网卡驱动被中断处理程序调用后,会从网卡的缓冲区取出收到的包,并通过MAC头部中的以太类型判断协议的类型。
- 网卡根据以太类型将包交给对应的协议栈处理。
2.5.11 将服务器的响应包从IP传递给TCP
- 首先IP模块检查IP头部,确认格式是否正确,没有问题就查看接收方的IP地址。如果IP地址不是自己的地址,IP模块会通过ICMP消息将错误告知发送方。ICMP规定了各种类型的消息。
- 如果包经过了分片,所有分片的包在IP头部都具有相同的ID,此外IP头部还有一个分片偏移量,它表示当前分片在整个包中所处的位置。根据这些信息,在所有分片全部收到之后,就可以将他们还原成原始的包,这个操作叫做分片重组。
- 接下来TCP模块工作,根据收发IP地址和端口号查找套接字,然后根据套接字的通信状态,执行响应的操作(收发数据或连接断开等响应控制)。