数据链路层
实作一: 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机房电脑 😉
- Opcode = 1时表示请求,此时目的MAC为ff:ff:ff:ff:ff:ff即广播
- Opcode = 2时表示回应,此时源MAC为手机MAC地址00:74:9c:9f:40:13, 目的MAC为电脑的MAC
根据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 建立和释放连接
三次握手:
- 浏览器发送携带[SYN]的报文段
- 服务器返回[SYN, ACK]的报文段
- 浏览器发送[ACK]的报文段,此时连接建立成功 四次挥手:
- 服务器发送携带[FIN, ACK]的报文段
- 浏览器发送携带[ACK]的报文段
- 浏览器发送携带[FIN, ACK]的报文段
- 服务器发送携带[ACK]报文段
同时建立多个tcp连接可以并发获取数据 tcp对断开连接优化,如果接收端没有数据发送,可以将第二步-第三步合并。
应用层
实作一 了解 DNS 解析
ipconfig/flushdns
清除缓存,命令行输入nslookup qige.io
抓包可以发现本机向默认DNS服务器`61.128.128.68。
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 |
状态码:
- 200: 成功
- 304: 表示资源在由请求头中的If-Modified-Since或If-None-Match参数指定的这一版本之后,未曾被修改。在这种情况下,由于客户端仍然具有以前下载的副本,因此不需要重新传输资源。
- 404: 不正确的URL重定向
304应答表示浏览器对于该内容有缓存(此前访问过),那么节约开销就会优先使用缓存。