第八章 Traceroute

win里的命令是tracert ,在实现上和linux不同。

书中的实现介绍是linux的,通过发送TTL(生存周期)为i++的包,获得icmp的超时报文,来知道路途每个路由器的IP。

es5里发送TTL为i++的UDP报文,指向目标地址一个不可能的端口,当抵达目标地址后,会返回一个端口不可达的icmp差错报文。

抓包发现,(es5)发送LLT为2的udp报文并不是等待LLT为1的报文回来后再发送,而是一口气连续发送很多udp,抓包中,一直发送到LLT为6的报文才收到回来的icmp超时报文。每个数值发送3次。

win里与书上实现的不同,发送的是TTL为i++的ping报文,每个数值发送3次,只有上一个报文返回icmp超时或等待超时或抵达目的返回ping报文才发送下一个ping报文。


所以es5找到的每个数值下的路由都可能不一样,而win找到的相似比较多。

由于每个不同值的TTL是单独发送的,可能通过的路由并不相同,所以显示的结果的顺序未必真的连在一条线上。

返回的icmp超时报文的TTL都是255 。

-------------------------------------------------------------------------------


第九章第十章

没有环境抓包测试。

-------------------------------------------------------------------------------


第十一章 UDP

udp的校验中,增加了一个伪首部,这个伪首部只参与检验和,但是不会实际发送。

如果校验失败,这个UDP报文会和IP报文一样直接丢弃,不返回任何差错报文。

IP分片在第三章里有一些,这里说的更清楚些。

实际MTU是路途中的最小MTU,发片不一样在出口或在入口进行,可能发生在路途上的某个路由器上。

IP数据包分片后,一直到目的地才重新组装,如果有一个出错,则剩下的全部在实际应用中都没有用了。

(某些网络协议在每一跳的都会中心组装,不详是那些协议,存疑。)

已经分过片的IP包,也可能在路途里再次分包。

被分成多个IP数据包的IP报文,他们的每个IP分包里的16位标志是相同的。3位标志是:0X00剩余片,0X020第一片,0X04不分包。包的顺序看偏移量,第一个包的偏移量是0,偏移量计算的是UDP报文长度而不是UDP用户数据长度。

如果不分片,IP包长度还大于了MTU,则回返回一个ICMP的差错报文(需要进行分片但设置了不分片比特),利用这个差错可以推断出最小MTU

类似traceroute的方法,发送一个不分片且长度为出口MTU的报文,出现错误后,持续降低IP包长度。逐个接近结果。

测试出我的环境下以太网的MTU是1500字节。

我发送了一个包含1500个a的数据(即数据长度1500),分2片,第一片数据长度1472,第二片28。

第一片总长度1472+8(udp首部)+20(ip首部)+14(frame,2个mac)为1514,所以MTU为1500 。


如果不限制MTU,IP包最长就是65535,那么扣除20字节IP头和8字节UDP头,UDP最长的用户数据为65507字节。

如果UDP携带的数据长度大于1472,那么UDP报文就会被分派,前面的IP包总长度都是1500(20+1480),最后一个包为剩下的数据长度。
我在前面有个地方理解错误的,我以为如果一个UDP报文大于65507,会变成多个IP包发过去,实际上会丢弃超过最大长度的数据。
编码的时候数据长度太长了大于65507甚至对某些编译器不通过。

UDP的应用包括DNS,TFTP,BOOTP,SNMP ,广播和多播也可以转送UDP,但是不能送TCP。

-------------------------------------------------------------------------------


第十二章 广播与多播

广播会增加无关机器的处理负荷,比如广播一个UDP报文,所有的机器都会接受,只有到达了UDP层才会被抛弃。

但是并不会增加网络流量,因为其他机器通过掩码发现这个包自己应该接受处理,所以实际上只有一份,而不是转发给所有主机。但是如果相应了端口不可达的差错报文,就可能增加网络流量。

指向所有子网的IP广播地址128.1.255.255,我在公网上ping它,竟然有个192.1.102.1的主机返回了我了。

A发送给255的UDP报文,所有人都会收到(而不是每个人都发一份),编码发现,某个接受方B得到的UDP地址和端口都是A的,这样返回的报文就会发给A,但是由于A发送的对象是255,所以A在socket一层是收不到的B的报文,但是抓包会发现B给A回了报文的。

另外发现es5的权限设置的比win高,我在win上可以给广播UDP,但是同样的代码在es5上却失败了,告诉我权限限制,目前还不知道在哪里设置,存疑。