谈谈我对TCP三次握手的理解

·  阅读 242

网络上很多文章感觉太复杂了,我试试化繁为简!

🔴简而言之就是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、过了一会第一次发送的报文终于达到了接收方,接受方也会发送一个确认应答,

​ 但是由于双发已经进行了三次握手了,因此发送方会忽略这次的确认应答,并且不会发送第三次握手的请求。

分类:
阅读
标签: