前言
从浏览器上输入一个网址/url,到出现一个网页的过程涉及到网络的方方面面,本文不过多详解http具体原理等,仅对网络中包的封装、转发等简单分析。
在这之前回顾下一些网络基础:
- TCP比UDP多了拥塞控制、超时重传、流量控制(双方各声明一个窗口,别发的太快或太慢)
- 要传输的数据可能非常大,直接传出就不好传输,所以当大于MSS,就会分段传输;这样的话,当某一段丢失,只需要重传那一段即可。
网址到网页的出现都发生了什么?
发包
-
解析url : 分解网址,确定 web服务器和 文件名, url组成元素分别是:协议、主机名、端口、路径、片段标识符。然后形成http请求消息;
-
dns解析 : 请求解析服务器对应的ip地址。请求的dns服务器顺序是:本地dns服务器—根域名服务器—.com顶级域名服务器—权威dns服务器告诉本地dns服务器—告诉客户端
-
HTTP传输工作交给协议栈:TCP、UDP、ICMP、ARP等
- TCP可靠传输:
- 三次握手:保证双方都有发送和接收的能力;
- 查看tcp链接状态:
netstat -napt
; - http消息过长(超过MSS),分解成一块块的数据段;
- MTU:一个网络包的最大长度。以太网一般是1500字节
- MSS:出去TCP、IP头部后,一个网络包所能容纳的TCP数据的最大长度
- TCP的数据部分:HTTTP头部+数据
- 网络层:加上IP头部(源、目的IP、协议号06代表HTTP等),然后根据路由表发送
- 加上MAC头部:发出—->先看ARP缓存表—->没有就广播出去
- 数字信号到电信号:上述都是数字信号,数据包到网卡之后,复制到网卡内的缓存区,+报头+起始帧分界符+FCS(尾部),以电信号发出。
以上为浏览器所在主机发包的过程。
链路上传输
- 交换机:
- 通过内置模块先将电信号转成数字信号;
- FCS校验错误—>无错,放入缓存区;
- 和计算机不同,交换机属于纯二层设备,端口不具备MAC地址,也不会核对接收到的MAC地址,直接放入缓冲区。
- 查本地的ARP表,有—>根据对应的端口号发出;无—>通过所有的端口号发出。
- 路由器:
- 电信号转换成数字信号;
- FCS校验错误;
- 检查接收方的MAC地址,如果不是给我的—->丢弃;
- 剥掉MAC头部(MAC头部的作用就是将包送到路由器)
- 转发
- 根据路由表查转发目标;
- 根据IP查mac地址,查询的结果即接收方的MAC;
- 封装发出。
从上述过程可以看出一直不变的是源、目的ip,一直变化的是MAC。
接收
- 剥掉MAC头部,看是不是给自己的,不是—>丢弃;
- 剥掉IP头,根据IP头中的协议项知道上层的是TCP协议;
- 剥掉TCP头,里边有序列号,看是不是我想要的,是—>放入缓存并返回ACK;不是—>丢弃;
- TCP头部有端口号,同样的HTTP服务正在监听这个端口号,数据包给HTTP
- HTTP进程将要请求的网页封装到HTTP响应报文中发出;
- 再经过+tcp + ip+MAC等一系列上面的过程再发出—>网卡—->交换机—>路由器—>客户端。