引言
在之前的讨论中,我们已经对HTTP和DNS协议进行了详细的探讨,这些协议主要用于应用层的通信。然而,今天我们将把重点转移到网络层和传输层的协议上,也就是TCP/IP协议。所以,我们将深入研究这些协议的工作原理和作用。
可靠传输-TCP
HTTP是一种基于TCP协议传输的协议。在TCP传输数据之前,需要进行三次握手来建立连接。如果HTTP请求消息的长度超过了MSS(Maximum Segment Size)的限制,那么TCP就需要将HTTP数据拆分成多个块来发送,而不是一次性发送所有数据。
在网络中,MTU(Maximum Transmission Unit)指的是一个网络包的最大长度,例如以太网中一般为1500字节。而MSS则是在去除IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度。
当数据长度超过MSS时,数据会被拆分成多个块,每个块的长度为MSS。每个被拆分的数据块都会被放入单独的网络包中,并在每个被拆分的数据块中添加TCP头信息,然后由IP模块来发送这些数据。
TCP 报文生成
TCP协议中涉及两个端口,一个是浏览器监听的端口(通常是随机生成的),另一个是Web服务器监听的端口(HTTP默认端口号为80,HTTPS默认端口号为443)。
一旦建立了连接,TCP报文的数据部分就包含了HTTP头部和数据。组装好TCP报文后,就会交给下一层的网络层来处理。
因此,网络包的报文可以用下图表示:
远程定位-IP
在 TCP 模块执行连接、收发、断开等操作的各个阶段,都需要委托 IP 模块将数据封装成网络包,并发送给通信对象。在 IP 协议中,需要包含源地址 IP 和目标地址 IP 两个关键信息:
- 源地址 IP 是指客户端输出的 IP 地址,它表示数据包的发送方。
- 目标地址 IP 是通过 DNS 域名解析获取的 Web 服务器的 IP 地址。
在进行 TCP 传输时,由于 HTTP 是经过 TCP 传输的,因此在 IP 包头的协议号字段中需要填写为 06(十六进制),表示协议为 TCP。
当客户端存在多个网卡时,即有多个 IP 地址可供选择时,需要根据具体情况来确定选用哪个 IP 地址作为源地址。这个选择过程相当于在多个网卡中判断应该使用哪个网卡来发送数据包。
为了确定源地址 IP,需要根据路由表规则进行判断。路由表规则可以指定特定的条件,如目标 IP 地址、接口优先级等,从而决定使用哪个网卡的 IP 地址作为源地址。根据路由表规则的判断结果,就可以确定应该使用哪个网卡的 IP 地址作为源地址 IP。
IP 报文生成
两点传输-MAC
在生成 IP 头部之后,接下来网络包还需要在 IP 头部的前面添加 MAC 头部。
MAC 头部是以太网使用的头部格式,它包含了发送方和接收方的 MAC 地址等重要信息。MAC 头部的格式包括目标 MAC 地址、源 MAC 地址、类型字段等。
在发送网络包之前,需要在 IP 头部之前添加 MAC 头部,以确保数据可以正确地在以太网中传输。MAC 头部的目标 MAC 地址指示了网络包应该传输到哪个设备,源 MAC 地址指示了数据的来源。
在 MAC 包头中,发送方和接收方的 MAC 地址是必须包含的信息,用于实现两点之间的传输。通常在 TCP/IP 通信中,MAC 包头的协议类型只使用以下两种:
- 0800:表示 IP 协议
- 0806:表示 ARP 协议
发送方的 MAC 地址获取相对简单,因为 MAC 地址是在网卡制造时写入到 ROM 中的,只需要将这个值读取出来,并写入到 MAC 包头中即可。
然而,接收方的 MAC 地址相对复杂一些。为了让以太网帮助我们将数据包发送给正确的目标,我们需要提供对方的 MAC 地址。因此,我们需要先确定应该将数据包发送给谁,这可以通过查看路由表来获得。在路由表中找到匹配的条目后,我们可以将数据包发送给网关(Gateway)列中对应的 IP 地址。
当我们不知道对方的 MAC 地址时,可以通过使用 ARP(地址解析协议)来获取。ARP 协议会以广播的形式在以太网中发送一个请求,询问所有设备:"谁是拥有这个 IP 地址的设备?请告诉我你的 MAC 地址。"然后,将会有一个设备回答:"这个 IP 地址是我的,我的 MAC 地址是XXXX。"
如果对方设备和我们在同一个子网中,通过上述操作就可以获取到对方的 MAC 地址。然后,我们将这个 MAC 地址写入 MAC 包头部,这样 MAC 包头部就完成了。
需要注意的是,ARP 协议只在同一个子网中有效。如果目标设备不在同一子网中,就需要借助路由器来转发数据。在这种情况下,我们需要找到网关的 MAC 地址,将其作为接收方的 MAC 地址,以便将数据包正确地发送给网关,从而实现跨子网的通信。
MAC 报文生成
出口-网卡
IP 生成的网络包是存放在内存中的二进制数据,无法直接发送给对方。为了将数据在网络上传输,我们需要将其转换为电信号。这个过程由网卡负责执行,而网卡驱动程序则用于控制网卡。
当网卡驱动程序从IP模块获取到网络包后,它会将其复制到网卡内的缓存区中。然后,在数据包的开头添加报头和起始帧分界符,并在末尾添加用于检测错误的帧校验序列。这样,数据包就准备好可以通过网线发送了。
在数据包的处理过程中,起始帧分界符起着重要的作用,它是一个特定的标记,用来表示包的起始位置。当网卡驱动程序将数据包复制到网卡的缓存区后,添加起始帧分界符,这样接收方就可以准确地确定数据包的开始位置。
另外,末尾的帧校验序列(FCS)也是非常重要的。在数据包传输过程中,可能会发生噪声、干扰或其他错误,导致数据包损坏。为了确保数据的完整性,网卡在数据包的末尾添加了FCS。接收方在接收数据包时,会利用FCS对数据包进行校验,以检测是否有损坏或错误发生。如果校验结果与FCS不匹配,接收方将知道数据包在传输过程中发生了错误。
最后,当数据包准备好之后,网卡会将其转换为电信号,并通过网线发送出去。这样,数据包就能够被目标设备接收和处理。这个过程中,网卡起到了关键的作用,确保了数据的有效传输。
总结
通过本文的探讨,我们深入研究了TCP/IP协议在网络层和传输层的工作原理和作用。我们了解到,在TCP协议中,数据需要进行三次握手来建立连接,并且在传输过程中需要将数据拆分成多个块来发送。而在IP协议中,需要确定源地址和目标地址,并根据路由表规则来选择合适的网卡的IP地址作为源地址。在MAC协议中,需要添加MAC头部来指定发送方和接收方的MAC地址,以实现两点之间的传输。最后,在网卡的作用下,将数据转换为电信号并发送出去,确保数据的有效传输。