教你一个路由器的工作过程

对于普通人来说,只要能使用路由器访问互联网,合格的网络管理员就可以了解路由器的工作过程,特别是知道数据是如何通过路由器的。


First, when the data passes through the router, the connect function can be invoked on the original socket interface, and the connect function only sets the destination address.Again, the port number does not make sense for the original sleeve interface.For output, after calling connect, we can call write or send instead of SendTo because the destination address has been specified.


二,输出是常见的和指定的目标IP地址通过发送邮件或发送短消息,如果套接字连接,你也可以打电话和写信,writev或发送,如果没有设置ip_hdrincl选项,内核数据起始地址写的是第一个字节的IP头后。


在这种情况下,内核将构建IP报头并在处理数据之前保证它的安全性。内核将IPv4报头的协议字段设置为调用套接字函数时用户给出的第三个参数。


三、如果ip_hdrincl选项已被设置,数据地址由内核写的IP头的第一个字节。用户所提供的资料必须包括IP报头。在这种情况下,过程构成整个IP报头,除了下面的项目,与IPv4的标记字段可以设置0、需要内核设置的价值。只有当字段为0,内核将它和IPv4报头校验和的计算和存储的核心。


四、如果协议类型时指定的原始套接字接口创建,即第三参数的协议,这并不是说数据包类型只能被发送。例如,如果指定为ipproto_tcp协议UDP报文的发送,也可以用户自己组装,但如果没有设置ip_hdrincl选项,然后在IP核的消息将返回到TCP协议字段指示消息(但此时却为UDP报文)。


该包被发送到另一个TCP层,它通常被丢弃,因为它不能找到合适的TCP套接字来接收数据包。但是,包可以在目标主机的原始设置接口上接收。


五、如果ip_hdrincl选项已被设置,按照惯例,你应该建立自己的IP头,但是即使我们没有设置IP报头,发送数据或发送短消息和sendto指定目的IP地址还是可以做到的。但这样的包不能与原来的套接字接口的目标机器收到,因为在ip_rcv(),IP报头的校验应验证,并应分析,这样的包将被丢弃,但包应该能够在链路层收到。


六,如果你设置ip_hdrincl选项和数据包是长的,这样的数据将被丢弃,并会返回一个错误代码emsgsize。没有设置ip_hdrincl选项和数据包是长的,所以数据包将被分割,以获得通过原始套接口,首先要接收的数据包必须有一个完整的正确的IP头,或无法通过ip_rcv()在包头的检查和检验验证。


七,在数据包接收过程由原始套接字,内核会检查并确认接收的IP数据包,但它不会检测和验证IP封装后的任何领域。例如,当我们创建原始套接字接口,指定的协议参数ipproto_tcp,和内核不进行TCP校验和验证。相反,我们将所有数据包从IP协议字段复制到TCP,并将其提交到原始套接字接口。


八,与原始套接字接收的TCP包都是在IP重组后由TCP进行排序的所有先前消息,如果原始套接字接口指定的协议参数不是零(套接字的第三个参数),则接收的数据报的数据字段应该与它匹配。


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


如果原始套接字接口通过连接指定另一方的IP地址,则所接收的包的源IP地址应与连接地址相匹配,否则该数据包将不会传递到套接字。







通过原始套接口没有收到任何ARP和RARP协议类型接口,因为net_rx_action()将ARP协议报文的协议类型或ARP接收功能,不能转移到接收功能ip_rcv IP层(ICMP),因为某些类型的数据包在传输接口的原建立了系统的响应,而不是向上转移。