|
@@ -102,12 +102,20 @@ TCP 是**面向连接的、可靠的、基于字节流**的传输层通信协议
|
|
|
|
|
|
## TCP三次握手
|
|
|
|
|
|
-这个问题可以理解为为什么TCP不是两次握手,因为主要原因是两次握手只能确定一方的状态
|
|
|
+### 为什么需要三次握手
|
|
|
|
|
|
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
|
|
|
+
|
|
|
+**在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费**。
|
|
|
+
|
|
|
- 三次握手才可以同步双方的初始序列号
|
|
|
+
|
|
|
+TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素。**一来一回,才能确保双方的初始序列号能被可靠的同步。**
|
|
|
+
|
|
|
- 三次握手才可以避免资源浪费
|
|
|
|
|
|
+如果客户端发送的 `SYN` 报文在网络中阻塞了,重复发送多次 `SYN` 报文,那么服务端在收到请求后就会**建立多个冗余的无效链接,造成不必要的资源浪费。**
|
|
|
+
|
|
|
需要注意的是**第三次握手是可以携带数据的,前两次握手是不可以携带数据的**
|
|
|
|
|
|
![image-20230509151944605](assets/image-20230509151944605.png)
|
|
@@ -245,3 +253,14 @@ TCP 的 Keepalive 这东西其实就是 **TCP 的保活机制**
|
|
|
- 固定长度的消息:这种是最简单方法,即每个用户消息都是固定长度的,比如规定一个消息的长度是 64 个字节,当接收方接满 64 个字节,就认为这个内容是一个完整且有效的消息。
|
|
|
- 特殊字符作为边界:我们可以在两个用户消息之间插入一个特殊的字符串,这样接收方在接收数据时,读到了这个特殊字符,就把认为已经读完一个完整的消息。
|
|
|
- 自定义消息结构:我们可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。
|
|
|
+
|
|
|
+## 从输入 URL 到页面展示到底发生了什么?(非常重要)
|
|
|
+
|
|
|
+总体来说分为以下几个过程:
|
|
|
+
|
|
|
+1. DNS解析
|
|
|
+2. TCP连接
|
|
|
+3. 发送HTTP请求
|
|
|
+4. 服务器处理请求并返回HTTP报文
|
|
|
+5. 浏览器解析渲染页面
|
|
|
+6. 连接结束
|