本文将介绍数据包在路由器上如何传输和交换的基本知识。 明白了这一点,就有助于构成良好的网络环境。
一、输入问题
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