{/dede:field.body}

本文将介绍数据包在路由器上如何传输和交换的基本知识。 明白了这一点,就有助于构成良好的网络环境。

一、输入问题

1、原始套接字可以接收任何tcp或udp消息。

2、为了接收原始的套接字,首先接收的数据包需要完美正确的ip头。 否则,无法在ip_rcv ( )的标题中进行检查和验证。

3 .内核在原套接字接口接收的包中,对接收的ip包进行校验和验证,但不进行ip包以后的字段的检测和验证。 例如,在创建原始套接字时,指定的协议参数是ipproto_tcp,内核不进行tcp校验和验证,而是复制ip报头中的协议字段为tcp的所有分组,然后单击

4、原始套接字接口接收的tcp包全部进行ip重组后,tcp对以前的消息进行排序。

5、创建原始套接字时,如果指定的协议参数不为零(套接字的第三个参数),则必须与接收到的数据报的协议字段匹配。 否则,此数据报不会传播到此接口。

6 .如果本地ip地址绑定到原始套接字接口,则接收到的数据报的目标ip地址必须与绑定的ip地址匹配。 如果不匹配,则数据包不会传播到套接字接口。

7、该原始的socket通过connect指定对方的ip地址时,接收到的数据包的发送源ip地址必须与目的地地址一致。 否则,包不会传播到套接字。

8 .如果原始套接字是以协议参数0的方法创建的,并且未调用connect或bind,则内核传播到原始套接字的每个原始数据报都将接收副本。

9、原套接字接口无法接收arp或rarp协议类型的套接字接口。 net_rx_action ) )不会将arp或rarp协议类型的包传播到arp的接收函数系来解决,也不会传播到ip层的接收函数ip_rcv ) )。

10、原套接字接口并不是可以接收任何icmp类型的包。 这是因为一些icmp类型的包在传播到原始的套接字接口之前被系统响应,不再传播到上层。

11、对方的包被分片化的情况下,由于原始的套接字接口的接收位于ip上层,所以接收重组后的原始的ip包。

二、输出问题

1、通常的输出通过sendto或sendmsg进行,通过指定目标ip地址进行。 如果套接字已经连接,也可以调用write、writev或send。

2、在没有设定ip_hdrincl选项的情况下,内核写入的数据的起始地址是ip报头之后的第一个字节。 因为在这种情况下,内核会构建ip标头,并将其放置在流程数据之前。 内核将ipv4标头的协议字段设置为客户调用套接字函数时提供的第三个参数。

3、在设定了ip_hdrincl选项的情况下,内核写的数据实际上是ip报头的第一个字节。 客户提供的数据必须包含ip标头。 此时,流程结构将组成除以下两个以外的整个ip标头: ipv4标签字段可以设置为0,并且必须在内核中设置该值。 此外,只有在此字段为0时才设置内核,ipv4标头的校验和由内核计算并保存。

4、如果在创建原始套接字时指定了协议类型,即第三参数protocol,那并不是只能发送该类型的分组。 例如,如果在protocol中指定ipproto_tcp,则客户端可以发送自己组装的udp消息,但是如果此时未设置ip_hdrincl选项,则内核会进行ip报头的协议填充 (但是,在这种情况下是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协议的互联网时,分组实际上正在互联网中传播

来源:雪球新闻网

标题:“路由器互联网中数据包传输拆析”

地址:http://www.xiaolihe.cn/xqsmkj/1766.html