数据链路层

实作一: Ethernet帧结构

Wireshark展示的帧中没有FCS(Frame Check Sequence)的原因:
在Wireshark接受这一帧之前,NIC(network interface card)已经在硬件中处理过FCS。 详情见: Wireshark Ethernet Packet format

实作二:子网内/外通信时的 MAC 地址
ping *****发出帧的目的MAC为00-74-9c-9f-40-13,返回帧的源MAC地址也为00-74-9c-9f-40-13,该MAC地址为教室33号计算机的物理地址。

ping qige.io发出帧的目的MAC地址为00-74-9c-9f-40-13, 返回帧的源MAC地址也为00-74-9c-9f-40-13,该MAC地址为网关的物理地址。

ping www.cqjtu.edu.cn发出帧的目的MAC地址为00-74-9c-9f-40-13, 返回帧的源MAC地址也为00-74-9c-9f-40-13,该MAC地址为网关的物理地址。

在同一子网之内进行通信,是不需要将网关介入其中,只有当主机个非子网设备进行通信的时候,才需要将数据包全部发给网关设备,再经由网关设备进行转发或者是有路由处理等。GateWay wiki

实作三: ARP解析过程
突然想到手机也有IP,放弃ping机房电脑 😉

根据wireshark抓包可以看到,此次arp请求的目的IP地址为网关,arp回应由网关发送。

假使访问非本子网IP不通过网关,那么广播帧会发送到整个网络中,非常混乱。


网络层

实作一: IP包结构
一个典型的IPv4包结构如下

一个IPv4 packet头部中既有header length, 也有total length,方便再传输层中将头部和数据割分开。

实作二: IP包的分段与重组
ping 202.202.240.16 -l 2000 测试ip包分段重组,由于以太网的MCU为1500字节,所以该数据会分片。

Flags字段中DF(Don’t fragment)是否分片、MF(More fragment)是否为最后一片。
Fragment Offset标识在数据中的相对位置。 Fragement Offset为1480是由于首片存在20字节的头部。

ipv6中遇到大数据包会回应ICMP分组太大差错报文,发送方重发数据。

实作三: TTL事件
由图示,tracert从本机连续发出3个TTL为1的ICMP数据报,当到达第一个路由器时,路由器返回一个响应超时信息。tracert接收到超时信息将TTL + 1继续发送,遂到达第二个路由器,重复上面的步骤,直到到达目的ip。

问题假设收到一个TTL为50的包,大概率经过了64 - 50 = 14跳。


传输层

实作一: 熟悉 TCP 和 UDP 段结构

多路复用,端对端之间应用程序的连接。

实作二: 分析 TCP 建立和释放连接
三次握手:

同时建立多个tcp连接可以并发获取数据 tcp对断开连接优化,如果接收端没有数据发送,可以将第二步-第三步合并。

应用层

实作一 了解 DNS 解析

DNS报文分为定长的12字节头部和4个可变长的字段组成(请求、回应..),详情可见tcp/ip详解

实作二 了解HTTP的请求和应答

请求字段(更多请访问Wiki):

字段名 说明 示例
Accept 能够接受的回应内容类型(Content-Types)。参见内容协商。 Accept: text/plain
Accept-Charset 能够接受的字符集 Accept-Charset: utf-8
Accept-Encoding 能够接受的编码方式列表。参考HTTP压缩。 Accept-Encoding: gzip, deflate
Accept-Language 能够接受的回应内容的自然语言列表。参考 内容协商 。 Accept-Language: en-US
Host 服务器的域名(用于虚拟主机 ),以及服务器所监听的传输控制协议端口号。如果所请求的端口是对应的服务的标准端口,则端口号可被省略。 Host: zh.wikipedia.org
If-Modified-Since 允许在对应的内容未被修改的情况下返回304未修改( 304 Not Modified ) If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match 允许在对应的内容未被修改的情况下返回304未修改( 304 Not Modified )参考 超文本传输协议 的实体标记 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
User-Agent 浏览器的浏览器身份标识字符串 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0
Connection 该浏览器想要优先使用的连接类型 Connection: keep-alive

应答字段:

字段名 说明 示例
Server 服务器的名字 Server: Apache/2.4.1 (Unix)
Status 状态码 Status: 200 OK
Content-Encoding 在数据上使用的编码类型。参考超文本传输协议压缩。 Content-Encoding: gzip
Access-Control-Allow-Origin 指定哪些网站可参与到跨来源资源共享过程中 Access-Control-Allow-Origin: *
Content-Type 当前内容的MIME类型 Content-Type: text/html; charset=utf-8
Content-Length 回应消息体的长度,以字节(8位为一字节)为单位 Content-Length: 348
Cache-Control 向从服务器直到客户端在内的所有缓存机制告知,它们是否可以缓存这个对象。其单位为秒 Cache-Control: max-age=3600

状态码:

304应答表示浏览器对于该内容有缓存(此前访问过),那么节约开销就会优先使用缓存。