博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP协议三次握手、四次挥手过程分析
阅读量:4141 次
发布时间:2019-05-25

本文共 2442 字,大约阅读时间需要 8 分钟。

TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

三次握手

Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

实例:

IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836

IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1

第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;

第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;

第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。

 

图解:

一个三次握手的过程(图1,图2)

(图1)

(图2)
 

第一次握手的标志位(图3)

我们可以看到标志位里面只有个同步位,也就是在做请求(SYN)
3 
 (图3)
第二次握手的标志位(图4)
我们可以看到标志位里面有个确认位和同步位,也就是在做应答(SYN + ACK)
4 
(图4)
第三次握手的标志位(图5)
我们可以看到标志位里面只有个确认位,也就是再做再次确认(ACK)
5 
 
(图5)
一个完整的三次握手也就是 请求---应答---再次确认

四次挥手

TCP连接终止需四个分节。

 (
1
TCP
客户端发送一个
FIN
,用来关闭客户到服务器的数据传送(报文段
4
)。
 (
2
) 服务器收到这个
FIN
,它发回一个
ACK
,确认序号为收到的序号加
1
(报文段
5
)。和
SYN
一样,一个
FIN
将占用一个序号。
 (
3
) 服务器关闭客户端的连接,发送一个
FIN
给客户端(报文段
6
)。
 (
4
) 客户段发回
ACK
报文确认,并将确认序号设置为收到序号加
1
(报文段
7
)。

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
 这是因为服务端的
LISTEN状态下的
SOCKET当收到
SYN报文的建连请求后,它可以把
ACK
SYN
ACK起应答作用,而
SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的
FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭
SOCKET,也即你可能还需要发送一些数据给对方之后,再发送
FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的
ACK报文和
FIN报文多数情况下都是分开发送的.
 
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的
4个报文也都协调和发送完毕,按理可以直接回到
CLOSED状态(就好比从
SYN_SEND状态到
ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的
ACK报文会一定被对方收到,因此对方处于
LAST_ACK状态下的
SOCKET可能会因为超时未收到
ACK报文,而重发
FIN报文,所以这个
TIME_WAIT状态的作用就是用来重发可能丢失的
ACK报文。

转载地址:http://xzrvi.baihongyu.com/

你可能感兴趣的文章
leetcode刷题198 打家劫舍 House Robber(简单) Python Java
查看>>
NG深度学习第一门课作业2 通过一个隐藏层的神经网络来做平面数据的分类
查看>>
leetcode刷题234 回文链表 Palindrome Linked List(简单) Python Java
查看>>
NG深度学习第二门课作业1-1 深度学习的实践
查看>>
Ubuntu下安装Qt
查看>>
Qt札记
查看>>
我的vimrc和gvimrc配置
查看>>
hdu 4280
查看>>
禁止使用类的copy构造函数和赋值操作符
查看>>
C++学习路线
查看>>
私有构造函数
查看>>
组队总结
查看>>
TitledBorder 设置JPanel边框
查看>>
DBCP——开源组件 的使用
查看>>
抓包工具
查看>>
海量数据相似度计算之simhash和海明距离
查看>>
DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
查看>>
DeepLearning tutorial(6)易用的深度学习框架Keras简介
查看>>
DeepLearning tutorial(7)深度学习框架Keras的使用-进阶
查看>>
流形学习-高维数据的降维与可视化
查看>>