首先理解一些基础的知识点
1. IP:把数据包送达目的主机
计算机的地址就称为 IP 地址,访问任何网站实际上只是你的计算机向另外一台计算机请求信息。
IP 通过 IP 地址信息把数据包发送给指定的电脑
因为ip难以记忆,域名系统DNS(Domain Name System)就产生了,负责把域名和 IP 地址做一一映射关系
2. UDP:把数据包送达应用程序
UDP是什么
用户数据包协议(User Datagram Protocol),简称 UDP
UDP 中一个最重要的信息是端口号
UDP头组成
UDP 头中除了目的端口,还有源端口号等信息
UDP能干啥
UDP 通过端口号把数据包分发给正确的程序
UDP特点
UDP 不能保证数据可靠性,但是传输速度却非常快
虽然 UDP 可以校验数据是否正确,但是对于错误的数据包,UDP 并不提供重发机制,只是丢弃当前的包
3. TCP:把数据完整地送达应用程序
TCP 是什么
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
有什么
TCP头包含了目标端口和本机端口号外,还提供了用于排序的序列号,以便接收端通过序号来重排数据包
一个TCP的生命周期
特点
- 对于数据包丢失的情况,TCP 提供重传机制;
- TCP 引入了数据包排序机制,用来保证把乱序的数据包组合成一个完整的文件。
4、http协议
HTTP 协议作为应用层协议,用来封装请求的文本信息,HTTP 的内容是通过 TCP 的传输数据阶段来实现的
浏览器是如何发送请求信息给服务器的
顺便贴下TCP/IP四层模型图
总结一下 浏览器输入url之后都发生了什么
1、首先,浏览器进程接收到用户输入的 URL 请求,浏览器进程便将该 URL 转发给网络进程。
2、网络进程接收到url请求后检查本地缓存是否缓存了该请求资源,如果有则将该资源返回给浏览器进程
2、否则,在网络进程中发起真正的 URL 请求。
HTTP 请求流程
1. 构建请求
2. 查找缓存
3. 准备 IP 地址和端口
4. 等待 TCP 队列
5. 建立 TCP 连接
6. 发送 HTTP 请求
## 服务器端处理 HTTP 请求流程
1. 返回请求
2. 断开连接 如果是长链接 就不断开Connection:Keep-Alive
3. 是否是重定向 否则返回数据
3、接着网络进程接收到了响应头数据,便解析响应头数据,并将数据转发给浏览器进程。
浏览器进程检查响应类型Content-Type,如果是字节流类型,则将该请求提交给下载管理器,该导航流程结束,不再进行 后续的渲染,
如果是html则通知浏览器进程准备渲染进程准备进行渲染。
浏览器进程检查当前url是否和之前打开的渲染进程根域名是否相同,如果相同,则复用原来的进程,如果不同,则开启新的渲染进程
4、浏览器进程接收到网络进程的响应头数据之后,发送“提交导航 (CommitNavigation)”消息到渲染进程;
5、渲染进程接收到“提交导航”的消息之后,便开始准备接收 HTML 数据,接收数据的方式是直接和网络进程建立数据管道;
6、最后渲染进程会向浏览器进程“确认提交”,这是告诉浏览器进程:“已经准备好接受和解析页面数据了”。
7、浏览器进程接收到渲染进程“提交文档”的消息之后,便开始移除之前旧的文档,然后更新浏览器进程中的页面状态: 安全、地址栏url、前进后退的历史状态、更新web页面。
http请求流程图
相关扩展
1、浏览器可以同时打开多个页签,他们端口一样吗?如果一样,数据怎么知道去哪个页签?
端口一样的,网络进程知道每个tcp链接所对应的标签是那个,所以接收到数据后,会把数据分发给对应的渲染进程。
- TCP传送数据时 浏览器端就做渲染处理了么?如果前面数据包丢了 后面数据包先来是要等么?类似的那种实时渲染怎么处理?针对数据包的顺序性?
接收到http响应头中的content-type类型时就开始准备渲染进程了,响应体数据一旦接受到便开始做DOM解析了!基于http不用担心数据包丢失的问题,因为丢包和重传都是在tcp层解决的。http能保证数据按照顺序接收的(也就是说,从tcp到http的数据就已经是完整的了,即便是实时渲染,如果发生丢包也得在重传后才能开始渲染)
- http 和 websocket都是属于应用层的协议吗?
都是应用层协议,而且websocket名字取的比较有迷惑性,其实和socket完全不一样,可以把websocket看出是http的改造版本,增加了服务器向客户端主动发送消息的能力。
- 关于 "数据在传输的过程中有可能会丢失或者出错",丢失的数据包去哪里了?凭空消失了吗?出错的数据包又变成啥了? 为什么会出错?
比如网络波动,物理线路故障,设备故障,恶意程序拦截,网络阻塞等等