网络上很多文章感觉太复杂了,我试试化繁为简!
🔴简而言之就是3句话:
客户端:发送连接请求报文,
服务端:回复同意报文(应答),
客户端:回复确认报文(应答)。
一、2个概念
1、TCP三次握手?
对应TCP连接的一种概念。
2、TCP头部中携带的信息有什么?
2.1 标识符
| TCP头部的标识符 | 中文名 | 简要描述 |
|---|---|---|
| ACK | 确认位 | ACK = 1 表示该确认号有效 |
| SYN | 同步位 | SYN = 1 表示这是是一个连接请求的报文 |
| FIN | 终止位 | FIN = 1 表示这是释放连接的报文 |
除了这三个标识符外还有3个这里不展开说明。
2.2 序列号和确认号
| TCP头部的信息 | 中文名 | 简要描述 |
|---|---|---|
| seq (Sequece Number) | 序列号 | 表示当前TCP数据报数据的第一个字节的序号是多少 |
| ack (Acknowledgement Number) | 确认号 | 表示数据接收端期望收到的下一个数据的序号是多少,同时也表示上一个序号之前的数据已收到 |
2.2.1 脑放
👇TCP首部信息在这里 👇seq 就是这段数据第一个字节的序号
来图看看
了解了这些概念之后就可以用比较通俗的话来展开解释TCP三次握手和四次挥手了
二、具体说明
1、TCP协议中2个角色?
| 行为 | 角色 |
|---|---|
| 主动发起请求的一方 | 客户端 |
| 被动接收连接的一方 | 服务端 |
2、TCP连接建立之后可以做什么?
- 客户端和服务端都可以 发送 和 接收
数据 - 所以TCP是一个全双工的协议
3、TCP三次握手的过程
🔴简而言之就是3句话:
客户端:发送连接请求报文,
服务端:回复同意报文(应答),
客户端:回复确认报文(应答)。
🔴然后再看这个几个符号代表什么意思:
SYNSYN = 1 表示这是是一个连接请求的报文。
ACKACK = 1 表示该确认号有效。
seq表示当前TCP数据报数据的第一个字节的序号是多少。
ack表示数据接收端期望收到的下一个数据的序号是多少,同时也表示上一个序号之前的数据已收到。
🔴用表格呈现试试看
| 状态 | 角色 | 做什么 携带的信息 | 角色 | 状态 |
|---|---|---|---|---|
| CLOSE 关闭 | 客户端 | 双方都会创建TCB | 客户端 | CLOSE 关闭 |
| SYN-SENT 发送同步 | 客户端 | 发送连接请求的报文===>SYN=1 ,seq=x | 服务端 | LISTEN 监听 |
| ESTABLSHED 连接已建立 | 客户端 | <===回复同意连接的应答SYN=1 ,ACK=1,seq=y,ack=x+1 | 服务端 | SYN-RCVD 同步已接收 |
| 客户端 | 发送连接确认的应答===>ACK =1,seq=x+1,ack=y+1 | 服务端 | ESTABLSHED 连接已建立 | |
| 客户端 | <===发送和接收数据===> | 服务端 |
🔴用图片呈现看看(这个图不是我画的,我在慕课上截的,冒犯联系删)
🔴为什么2次握手就可以建立连接却要进行3次握手?
假设两次握手就建立了连接的话:
第一次握手的报文发送出去很久都没有得到达,发送方可能会认为第一个报文已经超时了。
于是又发送了一个同样的报文,并且很快就达到了接受方,进行第二次握手并建立了连接。
❗过了一会第次发送的报文终于达到了接收方,也建立了连接。相当于建立了两次TCP连接,这样就可能产生错误。
三次握手的如何解决这个问题?
1、第一次握手的报文发送出去很久都没有得到达,发送方可能会认为第一个报文已经超时了。
2、于是又发送了一个同样的报文,并且很快就达到了接受方,进行第二次握手并发送确认应答。
3、发送方接收到应答后,进行第三次握手,发送一个确认报文,发完进入ESTABLISHED状态,
接收方收到这个确认报文后也进入ESTABLISHED状态。
4、过了一会第一次发送的报文终于达到了接收方,接受方也会发送一个确认应答,
但是由于双发已经进行了三次握手了,因此发送方会忽略这次的确认应答,并且不会发送第三次握手的请求。