从键入网址到网页显示,期间发生了什么?
小林coding 图解网络
HTTP
浏览器先对输入的URL进行解析,从而生成发送给Web服务器的请求信息。
http: 协议名称
//表示服务器的名称
web服务器
/目录名/… 文件名 表示数据源(文件)的路径名
http://www.server.com/dir1/file1/html
server 服务器下 /dir1/file1.html
如果没有设置默认文件 就是访问 /index.html或者/default.html这些文件
对URL进行解析,确定web服务器和文件名,就可以通过这些信息生成HTTP请求信息了。
DNS
浏览器通过解析URL并生成HTTP消息后,委托操作系统将消息发送给web服务器。
发送之前需要查询服务器域名对应的IP地址 因为委托操作系统发送消息时,必须提供IP地址
IP地址很难记 所以一般都用域名 就跟通讯录里都存姓名一样
域名层级关系
域名中越靠后的层级越高
www.server.com .根域最顶级 之后是.com 之后是server.com
根域的DNS服务器信息保存在互联网中所有的DNS服务器中
所以客户端只要找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器
域名解析工作流程
- 客户端首先发现DNS请求,问www.server.com的IP是啥,并发给本地DNS服务器(也就是客户端TCP/IP设置中填写的DNS服务器地址)
- 本地域名服务器收到客户端的请求后,如果缓存里能找到,则直接返回IP地址。否则本地DNS会问它的根域名服务器,根域名服务器是最高层次,不能进行域名解析,但可以指明一条道路。
- 根DNS收到本地DNS请求后发现最后面是.com 说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
- 本地域名DNS收到顶级域名服务器地址后,会向.com发送请求,可以告诉我www.server.com的地址嘛
- 之后它继续把负责server.com的权威DNS服务器的地址给你
- 之后本地去问权威服务器 之后server.com权威服务器告诉你对应的IP地址
- 本地DNS再将IP地址返回客户端,客户端就可以和目标建立连接
DNS域名解析都是只指路,不带路
浏览器层次、操作系统层次、host文档层次 都没有才会去问
host文档(域名解析文档) 将主机名映射到IP地址的一个纯文本文件
协议栈
DNS获取IP后,就可以把HTTP的传输工作,交给操作系统的协议栈
协议栈的上半部分 是负责收发数据的TCP UDP 协议 他们会接受应用层的委托来执行收发数据的操作
协议栈的下面一半是用IP协议控制网络包收发操作,在互联网上传数据时,数据包会被切分成一块块的网络包,而将网络包发送给对面的操作就是由IP负责的。
IP中还包含ICMP和ARP协议
ICMP用于告知网络包传送过程中产生的错误以及错误信息。
ARP用于根据IP地址查询对应的以太网MAC地址
IP下面的网卡驱动程序负责控制网卡硬件 最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作
可靠传输 —— TCP
HTTP是基于TCP协议传输的,
源端口号和目标端口号是必不可少的,如果没有这俩端口号,数据就不知道应该发给哪个应用。
包的序号用来解决包乱序的问题
还有的是确认号 确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决不丢包的问题。
一些状态位,例如SYN是发起一个连接 ACK是回复 RST是重新连接
FIN是结束连接等 TCP是面向连接的,因此双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。
窗口大小是为了更好地做流量控制,通信双方各声明一个窗口,标明自己当前能处理的能力,不要发送的太快也不要太慢
TCP除了做流量控制外,还可以做拥塞控制 不能控制路口有多少车,但可以通过控制红绿灯,控制进来的车的数量
HTTP通信前 需要TCP建立连接,TCP连接的建立,通常称为三次握手
一开始,双方都处于CLOSED状态,先是服务器主动监听某个端口,处于LISTEN状态。
之后客户端一看服务器可以接收服务了,主动发起SYN之后进入SYN_SENT状态
服务器收到发起的连接,返回SYN,并且ACK(应答)客户端的SYN,之后处于SYN_RCVD状态
客户端收到服务器端的SYN和ACK之后,发送ACK的ACK,之后处于ESTABLISHED状态,因为它一发一收成功了。
服务端收到ACK的ACK后,处于ESTABLISHED状态,因为它也一发一收了。
三次握手的目的是保证双方都有发送和接收的能力。
TCP的连接状态查看 在linux中可以通过netstat -napt
TCP分割数据
如果HTTP请求消息较长,超过了MSS的长度,这时TCP就需要把HTTP的数据拆解成一块块的数据发送,而不是一次发送所有的数据,
MTU:一个网络包的最大长度,以太网一般为1500字节。
MSS:除去IP和TCP头部之后,一个网络包所能容纳TCP的数据最大长度。
数据会被以MSS为单位进行拆分,拆分出来的每个数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上TCP头信息,交给IP模块来发送数据。
IP头+TCP头+MSS=MTU
TCP报文生成
TCP协议里面会有两个端口,一个是浏览器监听的端口(通常随机生成),一个是WEB服务器监听的端口(HTTP默认端口号为80,HTTPS默认端口号为443)
TCP报文的数据部分就是存放了HTTP的头部+数据,组装好TCP报文,就交给下面的网络层处理。
网络层报文如下
TCP就可以保证安全到达 (TCP的头 就包含了一系列保证安全的措施,比如标志位等)