Ping
ping用于确定本机是否能与另一台主机交换数据包,根据返回的信息,推断TCP/IP参数设置是否正确,以及运行是否正常、网络是否通畅。ping发送接收的消息是报文(IP报文)。
ping的过程:
- 源主机发送”请求回显“(ping请求)
- 目标主机返回”回显应答“(ping请求)
- 源主机通过”回显应答“类型报文中的内容来判断是否能够正常连接
IP报文:
IP协议并不可靠,不保证数据能否被成功送达,由此引入ICMP(网络控制报文)协议。
ICMP传递差错报文以及其它需要注意的信息,供IP层或更高层(TCP或UDP)使用。经常被认为是IP层的一部分。
ICMP报文类型有多种,根据type和code来判断ICMP报文类型。
ICMP报文 = ICMP报头+Data((ICMP_Packet = ICMPHeader + Data))
- type和code
TYPE | CODE | Description | Query | Error |
---|---|---|---|---|
0 | 0 | Echo Reply——回显应答(Ping应答) | x | |
3 | 0 | Network Unreachable——网络不可达 | x | |
3 | 1 | Host Unreachable——主机不可达 | x | |
3 | 2 | Protocol Unreachable——协议不可达 | x | |
3 | 3 | Port Unreachable——端口不可达 | x | |
3 | 4 | Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 | x | |
3 | 5 | Source routing failed——源站选路失败 | x | |
3 | 6 | Destination network unknown——目的网络未知 | x | |
3 | 7 | Destination host unknown——目的主机未知 | x | |
3 | 8 | Source host isolated (obsolete)——源主机被隔离(作废不用) | x | |
3 | 9 | Destination network administratively prohibited——目的网络被强制禁止 | x | |
3 | 10 | Destination host administratively prohibited——目的主机被强制禁止 | x | |
3 | 11 | Network unreachable for TOS——由于服务类型TOS,网络不可达 | x | |
3 | 12 | Host unreachable for TOS——由于服务类型TOS,主机不可达 | x | |
3 | 13 | Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 | x | |
3 | 14 | Host precedence violation——主机越权 | x | |
3 | 15 | Precedence cutoff in effect——优先中止生效 | x | |
4 | 0 | Source quench——源端被关闭(基本流控制) | ||
5 | 0 | Redirect for network——对网络重定向 | ||
5 | 1 | Redirect for host——对主机重定向 | ||
5 | 2 | Redirect for TOS and network——对服务类型和网络重定向 | ||
5 | 3 | Redirect for TOS and host——对服务类型和主机重定向 | ||
8 | 0 | Echo request——回显请求(Ping请求) | x | |
9 | 0 | Router advertisement——路由器通告 | ||
10 | 0 | Route solicitation——路由器请求 | ||
11 | 0 | TTL equals 0 during transit——传输期间生存时间为0 | x | |
11 | 1 | TTL equals 0 during reassembly——在数据报组装期间生存时间为0 | x | |
12 | 0 | IP header bad (catchall error)——坏的IP首部(包括各种差错) | x | |
12 | 1 | Required options missing——缺少必需的选项 | x | |
13 | 0 | Timestamp request (obsolete)——时间戳请求(作废不用) | x | |
14 | Timestamp reply (obsolete)——时间戳应答(作废不用) | x | ||
15 | 0 | Information request (obsolete)——信息请求(作废不用) | x | |
16 | 0 | Information reply (obsolete)——信息应答(作废不用) | x | |
17 | 0 | Address mask request——地址掩码请求 | x | |
18 | 0 | Address mask reply——地址掩码应答 | x |
- checksum:用于检验数据包是否正确。
- ID:即每次运行可以Ping的程序都会获得一个进程ID,我们通过这个比较发送进程ID和回显应答中的ID,如果一样则说明是同一个Ping程序
- sequence:每发送一个信息就有一个sequence
- data:存放其它信息,如timeout
traceroute
向目标主机发送消息并依据回答判断目标主机状态,同时遍历源主机和目标主机交互线路上的所有路由器并判断其状态,一般以30为最大TTL(time to live),每经过一台主机,TTL就减少一。每次遍历的前提:交互线路有不超过TTL-1数量的路由器。
原理:
源主机发送一份TTL字段为n的IP数据给某个主机,就可以得到该主机的IP地址,我们让TTL字段从1开始依次递增,就可以得到源主机与目标主机之间所有的路由器的IP地址。当一个路由器收到一个IP数据报,若其TTL为1,那么该数据报在网络空间中的生存周期已经结束,这时,若收到该数据报的主机不是目标主机,那么该主机就会返回一份ICMP超时报文(包含该主机IP地址);若在TTL>=1的情况下到达目标主机,目标主机就会返回一份ICMP应答报文。
Timeout:
设置该参数的意义在于应对发出消息后消息丢失一直不会返回的情况,避免因为消息没有返回而一直等待下去。
type和code
根据ICMP报文的type和code判断该主机状态。
tries:
消息发出后可能会意外不会返回,设定tries规定尝试的次数
DNS
发包速度以ms为单位,很快;但通过DNS查询返回消息的主机信息以s为单位,不快。
chekcsum
着重讲述一下checksum(检验和):
checksum是一个从数据包中通过特定计算方式而得出的值,通过检验这个值是否正确,来判断数据包完整性。在网络上传输时,数据包存在损坏的风险,接收端用checksum检验数据包是否损坏。源主机计算cheksum并将其作为字段设置在报文中,目标主机收到数据包再次计算checksum,并与数据包中已有的checksum进行交叉检验。
计算cheksum的步骤:
- 将cheksum设置为0
- 每两个字节,后一个设为高位,前一个设为低位,相加。若和溢出(超过16位),取超出位与前16位相加。
- 字节数若为奇,那么最后一定剩一个字节,将该字节与前面计算所得相加,若和溢出(超过16位),取超出位与前16位相加。。若为偶,不会剩字节。
- 若还是溢出,继续取超出位与前16位相加。
- 取反,得到一个十进制数
- 主机字节序转为网络字节序(小端序转大端序)
小端序转大端序:
- 大端序(Big Endian):高位字节存放到低位地址(高位字节在前)。
- 小端序(Little Endian):高位字节存放到高位地址(低位字节在前)。
例子(0x12345678):
大端序:
小端序:
网路字节序统一为大端序。