Skip to content

网络发送数据包流程

网络数据包的组装和发送是一个复杂的过程,涉及多个网络协议层的协作。以下是从解析URL开始到数据包发送到服务器的详细步骤:

1. 解析URL

  • 输入URL:用户输入URL(如http://www.example.com/index.html)。
  • 解析协议:确定使用的协议(HTTP、HTTPS等)。
  • 解析域名:提取主机名(如www.example.com)。
  • 解析路径:提取资源路径(如/index.html)。

2. DNS解析

  • 检查缓存:浏览器检查本地缓存(如hosts文件、浏览器DNS缓存)是否有域名对应的IP地址。

  • 递归查询:如果缓存中没有,浏览器向配置的DNS服务器发起递归查询。

  • 本地DNS服务器可能依次查询根域名服务器、顶级域名服务器(.com)、权威域名服务器(example.com)以获取IP地址。

  • 获取IP:最终获得www.example.com对应的IP地址(如93.184.216.34)。

3. 建立TCP连接(以HTTP为例)

  • 三次握手
  1. SYN:客户端发送SYN包(序列号=x)到服务器。
  2. SYN-ACK:服务器回复SYN-ACK包(序列号=y,确认号=x+1)。
  3. ACK:客户端发送ACK包(确认号=y+1),连接建立。

4. 组装应用层数据(HTTP请求)

  • 构造HTTP请求
http
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
  • HTTPS:如果是HTTPS,会先进行TLS握手(交换密钥、验证证书等)。

5. 传输层封装(TCP)

  • 分割数据:如果HTTP请求过大,TCP会将其分割为适合的段(MSS通常为1460字节)。

  • 添加TCP头

  • 源端口(随机)、目的端口(如80)。

  • 序列号、确认号、窗口大小、校验和等。

6. 网络层封装(IP)

  • 添加IP头

  • 源IP(客户端IP)、目的IP(通过DNS获取的IP)。

  • 协议字段(如6表示TCP)、TTL(如64)。

  • 校验和、分片信息(如果需要)。

7. 数据链路层封装(以太网)

  • 添加帧头帧尾

  • 源MAC地址(客户端网卡MAC)、目的MAC地址(下一跳网关的MAC,通过ARP获取)。

  • 类型字段(如0x0800表示IPv4)。

  • 帧尾(FCS校验和)。

8. 物理层传输

  • 转换为电信号/光信号:网卡将帧转换为比特流,通过物理介质(如光纤、网线)发送。

9. 网络路由

  • 逐跳转发:数据包经过路由器、交换机等设备,每跳根据目的IP查询路由表决定下一跳。

  • 路由器解封装到IP层,检查目的IP并重新封装帧。

10. 服务器处理

  • 服务器接收
  1. 数据链路层校验帧并解封装。
  2. 网络层检查IP地址是否匹配。
  3. 传输层TCP重组数据段,校验序列号。
  4. 应用层(如HTTP服务器)处理请求并生成响应。

关键协议和技术

  • DNS:将域名解析为IP地址。
  • ARP:将IP地址解析为MAC地址。
  • TCP:可靠传输、流量控制、拥塞控制。
  • IP:路由寻址、分片。
  • TLS/SSL:加密(HTTPS)。

示例流程

  1. 用户输入http://www.example.com/index.html
  2. DNS返回93.184.216.34
  3. 客户端发送TCP SYN到93.184.216.34:80
  4. 完成三次握手后,发送HTTP请求。
  5. 服务器返回200 OK和网页内容。

注意事项

  • NAT:如果客户端在私有网络,路由器会替换源IP为公网IP。
  • 代理/CDN:请求可能被中间节点(如CDN边缘服务器)拦截。
  • IPv6:地址格式和部分字段与IPv4不同。

这个过程展示了从URL到数据包发送的端到端流程,实际网络中还可能涉及负载均衡、防火墙策略等复杂因素。

Released under the MIT License.