使用 Wireshark 任意进行抓包,熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
图中从上到下依次是IP包的:版本号(Version)、IP包头长度(Header Length)、服务类型(Type of Service)、IP包总长(Total Length)、标识符(Identifier)、标记(Flags)、片偏移(Fragment Offset)、生存时间(TTL) 、协议(Protocol)、头部校验(Header Checksum)、起源和目标地址(Source and Destination Addresses)。
IP 头部既有头部长度字段,也有总长度字段的原因: 头部长度字段的存在是因为ip选项的存在使得ip头部长度不固定,只有知道了头部长度才能准确定位数据的开始。 总长度字段的存在是为了便于传输时的识别IP总长度,节省时间,当长度超过1500B时就会被返回链路层进行分段。
IP 包的分段与重组 根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。 缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 172.19.1.2 -l 1600 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 172.19.1.2 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等。
可以看到,帧被分成了两个部分进行传输,图中Total Length表示切割后该IP包的长度,第一个包长为1500,第二个包长为148。 Flags为标记,为001的时候表示该分段为最后一段,000则表示不是最后一个分段。 Fragment Offset为片偏移,表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。
三次握手: ① 第一次握手:计算机发送的TCP报文中以[SYN]作为标志位,Seq=0; ② 第二次握手:服务器返回的TCP报文中以[SYN,ACK]作为标志位;Seq=0;Ack=1(第一次握手中Seq的值+1); ③ 第三次握手:计算机再向服务器端发送的TCP报文中以[ACK]作为标志位;Seq=1(第二次握手中Ack的值);Ack=1(第二次握手中Seq的值+1)。 ④ 建立连接成功
四次挥手: ① 一次挥手:TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。 ② 二次挥手:服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。 ③ 服务器关闭客户端的连接。 ④ 三次挥手:服务器发送一个FIN给客户端。 ⑤ 四次挥手:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果
对同一个站点,我们发出的 DNS 解析请求不止一个,其原因是这个网站设有好几个计算机,每一个计算机都运行同样的服务器软件。这些计算机的IP地址不一样的,但它们的域名却是相同的。这样,第一个访问该网址的就得到第一个计算机的IP地址,而第二个访问者就得到第二个计算机的IP地址等等,这样可使每一个计算机的负荷不会太大。