Index | Diary 2024-05-04

HTTP

浏览器第一步 - 解析 URL

生成发给 Web 服务器的请求信息

URL 解析

http: 访问数据的协议

// : 后面的字符是服务器名字

/ : 数据源的路径

web 服务器配置文件中指定根 / - /var/www/html

数据格式

(a) 请求报文
请求行 方法 sp URL sp 版本 cr lf
消息头 首部字段名 sp 字段值 cr lf  
...            
...            
cr lf  
消息体 data

GET 请求报文 消息体数据为空

    GET /path HTTP/1.1
    Accept: "/"

POST 请求报文

    POST /login HTTP/1.1
    Accept: "/"

    {
        "name": "用户名"
        "password": "xxxx"
    }
(b) 响应报文
状态行 版本 sp 状态码 sp 短语 cr lf
消息头 首部字段名 sp 字段值 cr lf  
...            
...            
cr lf  
消息体 data
    HTTP/1.1 200 OK
    Content-Length: 1024
    Content-Type: text/html
    
    <html>
    ...
    </html>

真实地址查询 -- DNS

查询服务器域名对应的 IP 地址

保存 Web 服务器域名与 IP 对应关系

浏览器查询域名缓存,else if 查询操作系统缓存, else if 查看 hosts 文件, else 查询本地服务器

. 代表不同层次的界限

从 any DNS 找到根域 DNS 服务器,再找到 any DNS 服务器

协议栈

完成 HTTP的传输工作

应用程序调用 socket 库,使协议栈工作

可靠传输 -- TCP

数据格式
源端口号 (16 bit) 目的端口号 (16 bit)
序号 (32 bit)
确认序列 (32 bit)
首部长度 (4 bit) 保留 (6 bit) URG / ACK / PSH / RST / SYN / FIN 窗口大小 (16 bit)
校验和 (16 bit) 紧急指针 (16 bit)
选项
数据

远程定位 - IP

TCP 模块在执行连接、收发、断开等阶段操作时,都需要委托 IP 模块将数据封装成 网络包 发送给通信对象

版本 (4 bit) 首部长度 (4 bit) 服务类型 TOS (8 bit)
总长度 (16 bit)
标识 (16 bit)
标志 (3 bit) 片偏移 (13 bit)
TTL (8 bit) 协议 (8 bit)
首部校验和 (16 bit)
源 IP 地址 (32 bit)
目标 IP 地址 (32 bit)
选项
数据 data

根据路由表规则,通过掩码选择对应源地址网卡

默认网关

0.0.0.0 掩码 0.0.0.0 最后会发到路由器,即 gateway 路由器地址

两点传输 - MAC

有了 IP 报头,还需要 MAC 头部

接受方 MAC 地址 (48 bit)
发送方 MAC 地址 (48 bit)
协议类型 (16 bit)
接受方 MAC 如何获得

查找路由表,把相应条目发给 gateway 列出的 IP 地址

或者用 ARP 协议,在以太网中广播,寻找目标 IP 的 MAC 地址

网卡

将内存中二进制数字信息,转换为电信号在网线上传播

需要网卡驱动程序 操作网卡

  1. 获取网络包
  2. 复制到网卡缓存区
  3. 在开头加上报头和起始帧分界符
  4. 在末尾加上用于检测错误的帧校验序列

送别者 - 交换机

为了将网络包原样转发到目的地,工作在 MAC 层

  1. 网线接口输入交换机
  2. 转换为数字信号,拖末尾的 FCS 没有错误,加入缓冲区
  3. 交换机不核对 MAC 地址,不具有 MAC 地址
  4. 查询接收方 MAC 地址是否已经在地址表中记录
    • 设备的 MAC 地址
    • 该设备在交换机哪个端口上 (MAC地址与网线端口映射表
  5. 如果找不到,就会发给所有端口(not 源端口)
    • 广播地址 MAC: FF:FF:FF:FF:FF:FF IP: 255.255.255.255

出境大门 - 路由器

路由器基于 IP,三层网络设备,每个端口都有MAC/IP地址

交换机基于以太网,二层网络设备,端口不具有MAC地址

路由器可以成为以太网 发送/接收方

路由表 查看转发目标,从响应端口发出

接收时检验是否是自己的MAC地址,确认发给自己

接收后回去掉MAC头部(MAC头部完成送达路由器的使命)

根据IP头部进行包的转发