概述
TCP模块在进行连接、收发、断开等各阶段的操作时,都需要委托IP模块将数据封装成网络包发送给通信对象
IP包头格式如下:
在 IP 协议里面需要有源地址 IP 和 目标地址 IP:
- 源地址IP,即是客户端输出的 IP 地址;
- 目标地址,即通过 DNS 域名解析得到的 Web 服务器 IP
因为 HTTP 是经过 TCP 传输的,所以在 IP 包头的协议号,要填写为06
(十六进制),表示协议为TCP。
TTL生存时间字段设置了数据报可以经过的最多路由数。它指定了数据报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器就减1。当该字段值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
对于校验和,如果首部在传输过程中没有发送任何错误,那么接收方计算的结构应该全为1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报,但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
IP路由选择
从概念上来说,IP路由选择是简单的,特别是对于主机来说。如果目的主机和源主机直接相连(如点对点链路)或者在一个共享网络上(以太网或令牌环网),那么IP数据报就直接发送到目的主机上。否则,主机把数据报发往一默认路由器上,由路由器来转发该数据报。大多数的主机都是采用这种简单机制。
在一般的体制中,IP可以从TCP、UDP、ICMP和IGMP接收数据报(即本地生成的数据报)并进行发送,或者从一个网络接口中接收数据报(待转发的数据报)并进行发送。IP层在内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表进行搜索一次。当数据报来自某个网络接口时,IP首先检测目的IP地址是否是本机的IP地址之一或者IP广播地址。
- 如果是,那么数据报就被发送到由IP首部协议指定的协议模块进行处理。
- 如果不是,那么:
- 如果IP地址被设置为路由器功能,那么就对路由器进行转发
- 否则就丢弃数据报
路由表中的每一项包含如下信息:
- 目的IP地址。它既可以是一个完整的主机地址
- 下一站(或下一跳)路由器的IP地址,或者有直接连接的网络IP地址。下一跳路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一跳路由器不是最终的目的,但是它可以把传送给它的数据报转发到最终目的。
- 标志。其中一个标志指明目的 I P地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口
- 为数据报的传输指定一个网络接口
IP路由选择是逐跳的进行的。从上面路由表信息可以看出,IP并不知道到达任何目的的完整路径。所有IP路由选择只为数据报传输提供下一站的IP地址。它假定下一站路由器比发送数据报的主机更接近目的,而且下一站路由器与该主机是直接相连的。
IP路由选择主要完成如下功能:
- 搜索路由表,寻找能与目的IP地址完全匹配的数据(网络号和主机号都要匹配)。如果找到,就把报文发送给该表目指定的下一站路由器或者直接连接的网络接口(取决于标志字段的值)
- 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。
- 搜索路由表,寻找标为“默认”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。
为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是 I P路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模,比如 Internet上的路由器有只有几千个表目,而不会是超过1 0 0万个表目。
假设客户端有多个网卡,就会有多个 IP 地址,那 IP 头部的源地址应该选择哪个 IP 呢?
当存在多个网卡时,在填写源地址IP时,就需要判断到底应该填写哪个地址,这个判断相当于在多块网卡中判断应该使用那一块网卡来发送包
这个时候就需要根据路由表规则,来判断哪一个网卡作为源地址IP
在 Linux 操作系统,我们可以使用 route -n
命令查看当前系统的路由表
举个例子,根据上面的路由表,我们假设 Web 服务器的目标地址是 192.168.10.200
。
- 首先先和第一条目的子网掩码(
Genmask
)进行 与运算,得到结果为192.168.10.0
,但是第一
个条目的Destination
是192.168.3.0
,两者不一致所以匹配失败。 - 再与第二条目的子网掩码进行 与运算,得到的结果为
192.168.10.0
,与第二条目的Destination 192.168.10.0
匹配成功,所以将使用eth1
网卡的 IP 地址作为 IP 包头的源地址。
那么假设 Web 服务器的目标地址是 10.100.20.100
,那么依然依照上面的路由表规则判断,判断后的
结果是和·第三条目匹配。
第三条目比较特殊,它的目标地址和子网掩码都是0.0.0.0
,这表示默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行。并且后续就把包发给路由器, Gateway
即是路由器的 IP 地址。
至此,网络包的报文如下图。
加上IP头部之后,数据包就有了远程定位的能力,但是目标主机一般比较远,我们还需要arp
协议来决定下一步跳到哪个主机(mac
)上。
最后
以上就是虚拟板栗为你收集整理的网络:IP数据包是如何进行远程定位的的全部内容,希望文章能够帮你解决网络:IP数据包是如何进行远程定位的所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复