# TCP/IP 协议
## 传输层
链路层,网络层,传输层,应用层。
- 应用层:常用的Http 通过Http协议设置相关数据,比如请求行,请求头,请求方法,请求体,请求参数等等(Https:Http+SSL,是在应用层和传输层之间对请求数据进行加密处理,和Http相比安全有证书的验证)
- 传输层:传输层是面向通信的最高层,也是用户功能的最底层。复用和分发,在发送端多个进程可复用一个传输层,在接收端为不同主机的不同进程进行分发数据。其中使用TCP协议、UDP协议等。
- 网络层:使用IP协议,这里面的IP协议不是指IP地址,IP协议包含IP地址和计算机的MAC地址,IP协议能够通过IP地址和MAC地址准确的找到你需求请求的服务器
- 物理层:就是我们平时接触的网卡和网卡的驱动程序等。
## 二、三次握手
> [参考链接](https://www.cnblogs.com/laowz/p/6947539.html)
### 两个序号和三个标志位:
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
### 建立新连接过程
客户端 -> SYN=1,seq=x -> 服务端
客户端 <- SYN=1,ACK=1,seq=y,ack=x+1 <- 服务端
客户端 -> ACK=1,seq=x+1,ack=y+1 -> 服务端
> seq 为单方面消息序列号,ack为单方面待收消息序列号。
## 三、四次挥手
### 断开连接过程
client -> FIN=m -> server
client <- ack=m+1 <- server
client <- FIN=n <- server
client -> ACK=1,ack n+1 -> server
### 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,
己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,
再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
- 1. HTML
- 1.1 HTML 标签
- 1.2 HTML 属性
- 1.3 HTML5
- 2. CSS/CSS3
- 2.1 CSS3
- 2.2 Less
- 2.3 Sass
- 3. JavaScript
- 3.1 JQuery
- 3.2 javascript code
- 3.3 es6
- 4. 前端框架
- 4.1 Angular4+
- 4.2 React
- 4.3 Vue
- 5. 综合知识
- 5.1 HTTP
- 5.2 websocket
- 5.3 综合问题集合
- 5.4 前端优化
- 6. 附加知识
- 6.1 TCP/IP
- 6.2 数据结构
- 6.3 前端开发
- 7. 相关工具
- 7.1 Git
- 7.2 调试
- 7.3 Linux
- 8. 其他需要了解的内容
- 8.1 Python3
- 8.2 Java
- 8.3 数据库