app教程网 学习教程 ip报文在路由器中的处理过程(路由器出现环路数据包会不会传递)

ip报文在路由器中的处理过程(路由器出现环路数据包会不会传递)

本文介绍了关于数据包如何在路由器中传输和交换的基本知识。只要明白这一点,对你配置一个好的网络环境会有很大的帮助。

首先,输入问题

1.最初的windows套接字可以接收任何TCP或UDP消息。

2.为了接收原来的windows sockets,要接收的数据包必须有完整正确的IP头,否则无法通过ip_rcv()中的头检查和验证。

3.在windows sockets接收原始数据包的过程中,内核会对接收到的IP包进行检查和验证,但不会对IP包之后的任何字段进行检测和验证。例如,当我们创建最初的windows套接字时,指定的协议参数是IPPROTO_TCP。

内核不会进行TCP校验和验证,而是直接复制IP头中所有协议字段为TCP的数据包,提交给原来的windows sockets。

4.原来windows sockets接收到的TCP包都是IP重组后,TCP排序前的包。

5.如果创建原始windows套接字时指定的协议参数不为零(套接字的第三个参数),则接收到的数据报的协议字段应该与之匹配。否则,数据报不会传输到windows套接字。

6.如果本地IP地址绑定到原始的windows套接字,则收到的数据报的目的IP地址应该与绑定的IP地址相匹配,否则数据包将不会被传送到windows套接字。

7.如果原来的windows sockets通过connect指定了一个相反的IP地址,那么收到的数据包的源IP地址应该与连接地址相匹配,否则数据包将不会被传输到windows sockets。

8.如果使用协议参数0创建原始windows套接字,并且未调用connect或bind,则windows套接字将接收内核传递给原始windows套接字的每个原始数据报的副本。

9.原有的windows sockets无法接收任何ARP或RARP协议类型的windows sockets,因为net_rx_action()会将ARP或RARP协议类型的数据包传递给ARP的接收函数进行处理。

不会传递给ip层的接收函数ip_rcv()。

10.原来的windows套接字不能接收任何ICMP类型的数据包,因为有些ICMP类型的数据包在传递到原来的windows套接字之前已经被系统响应,不再传递到上层。

11.如果对方的数据包是碎片化的,因为原来的windows sockets是在上层IP层接收的,所以会接收到重组后的原始IP包。

第二,输出的问题

1.普通输出通常是通过发送到或sendmsg并指定目的IP地址来完成的。如果连接了windows sockets,还可以调用write、writev或send。

2.如果没有设置IP_HDRINCL选项,内核写入数据的起始地址就是IP头之后的第一个字节。因为在这种情况下,内核将构造IP头,并将其放在来自进程的数据之前。

内核将IPv4报头的协议字段设置为用户在调用套接字函数时给出的第三个参数。

3.如果设置了IP_HDRINCL选项,内核写入数据的地址实际上是IP头的第一个字节。用户提供的数据必须包括IP报头。此时,该过程构造除了以下两项之外的整个IP报头:IPv4标志字段可以被设置为0,

要求内核设置这个值。并且只有当该字段为0时,内核才设置它,并且内核计算并存储IPv4报头校验和。

4.如果在创建最初的windows sockets时指定了协议类型,即第三个参数协议,并不意味着只能发送这种类型的数据包。比如,即使协议指定为IPPROTO_TCP,也可以发送用户自己组装的UDP消息。

但是如果此时没有设置IP_HDRINCL选项,内核会在IP头的protocol字段中指明后面的消息是TCP消息(但此时是UDP消息)。

等数据包发送到对方TCP层,一般说来会因为找不到合适的TCP套接口接收该数据包而被丢弃。不过该包可以在目标主机的原始套接口上接收到。

5、正如前面所述,任何时候,IP头的校验和都是由内核来设置的。

6、内核任何时候那会都不会对IP包以后的字段进行校验和验证。如,即使我们指定第三个参数protocol为IPPROTO_TCP,在数据发送时内核也不会对进行TCP校验和计算和验证。

7、如果IP_HDRINCL选项已设置,按照常规,我们应该组建自己的IP头,但是即使我们没有组建IP头,用sendto或sendmsg 并指定目的IP地址来发送数据是照样可以完成的。

但是这样的数据包在目标机上用原始套接口是接收不到的,因为在ip_rcv()中要对IP头进行验证,并且要分析校验和,所以该包会被丢弃,不过在链路层应该能够接收到该数据包。

8、如果设置了IP_HDRINCL选项,并且数据包超长,那么数据会被丢弃,并会返回出错码EMSGSIZE。如果未设置IP_HDRINCL选项,并且数据包超长,那么数据包会被分片。

正是因为数据包具上述的结构,安装了TCP/IP协议的电脑之间才能相互通信,在使用基于TCP/IP协议的网络时,网络中其实传递的就是数据包。

本文来自网络,不代表本站立场,转载请注明出处:https: