文章目录
一、进程与线程
进程就是在内存中正在运行 的应用程序。
- 在内存中独占一个内存空间
- 进程和进程之间是隔离的
线程:就是进程的最小执行单位。
- 一个进程是由多个线程组成的
- 每个线程之间
一个页面启动的时候到底启动了几个进程?
- 浏览器主进程 :主要负责页面显示、用户交互、子进程管理
- 渲染进程:核心任务是将HTML、CSS和javaScript转换为用户可以与之交互的页面。
- 网络进程:主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的
- GPU进程:GPU图形处理器。
二、七层网络结构:
- 物理层:使用一定的物理介质(光纤、网线wifi) 01 信号
- 数据链路层:MAC地址在数据链路层
- 网络层:IP协议
- 传输层:UDP(用户数据包协议)/TCP(传输控制协议)
- 其中UDP协议的特点: 只管发,不管收 DNS。什么情况下用到了UDP协议:微信电话 、流媒体
- TCP协议的特点
- 重传机制
- 排序机制–根据数据包的编号对数据进行排序,重组数据包。保证数据包的完整性和准确性。
- 会话层 断点续传
- 表示层 翻译 解决不同系统之间数据传输的问题
- 应用层 HTTP协议
什么是四层网络结构呢:
- 物理层 物理层、数据链路层
- 网络层
- 传输层
- 会话层、表示层、应用层
三、输入URL地址浏览器以及服务器上发生了什么:
此图参考了:https://juejin.cn/post/6846687590540640263
浏览器发送HTTP请求的流程:
- 构造请求行
- 查找缓存 有缓存就去找缓存,没有缓存就发送网络请求
- 准备IP地址和端口号
- 等待TCP队列 因为一个域名最多只能简历6个TCP连接
- 建立TCP链接
- 发送HTTP请求
服务器处理HTTP请求:
- 返回请求内容
- 断开连接
四、从输入URL地址到浏览器显示页面发生了什么?
从进程的角度讨论
浏览器主进程、网络进程、渲染进程
五、TCP的三次握手和四次挥手
一个完整的TCP连接生命周期包括了“建立连接”、“传输数据”和“断开连接”三个阶段。
1、三次握手
下面这个图对应的是三次握手,以及每次握手中涉及到的两个信号量:SYN、ACK
三次握手可以携带数据吗?
答:第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。假设第一次可以携带数据,如果有人恶意攻击服务器,每次都在第一次握手中的SYN报文放入大量数据,重复发送大量SYN报文,此时服务器会花费大量内存空间来缓冲这些报文,服务器就更容易被攻击了。
为啥不能两次握手?
因为这个时候服务端无法判断客户端是否可以接收数据。第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。
参考:原文链接:https://blog.csdn.net/LiuRzhi/article/details/119357828
2、四次挥手:
客户端:我数据传完了,我要下线了
服务器:知道了,我还有点数据,你等下
一段时间后:
服务器:我数据发完了,你可以下线了
客户端:好的
四次挥手:
-
客户端主动调用close时,向服务端发送结束报文段FIN报,同时进入
FIN_WAIT1
状态; -
服务器会收到结束报文段
FIN
报,服务器返回确认报文段ACK
并进入CLOSE_WAIT
状态,此时如果服务端有数据要发送的话,客户端依然需要接收。客户端收到服务器对结束报文段的确认,就会进入到FIN_WAIT2
状态,开始等待服务器的结束报文段; -
服务器端数据发送完毕后,当服务器真正调用close关闭连接时,会向客户端发送结束报文段
FIN
包,此时服务器进入LAST_ACK
状态,等待最后一个ACK
的带来; -
客户端收到服务器发来的结束报文段, 进入
TIME_WAIT
, 并发出送确认报文段ACK
;服务器收到了对结束报文段确认的ACK,进入CLOSED
状态,断开连接。而客户端要等待2MSL的时间,才会进入到CLOSED状态注:在tcp通信的时候,如果两端长时间没有数据往来,就会每隔端事件,服务器向客户端发送一个探测数据报,要求客户端进行回复, 如果连续多次没有收到相应的话,就认为连接已经断开。 长时间默认是2个小时,每隔段时间默认是75s,连续次数一般是9次。
发送HTTP请求
下面这个图是通过wireshark抓取来的数据样子、相应对应的数据样子。
这个是get请求,因此没有请求体,只有POST才有请求体。