当前位置:网站首页>TCP的三次握手和四次挥手
TCP的三次握手和四次挥手
2022-07-06 09:29:00 【社会你磊哥,命硬不弯腰】
一 TCP报文格式
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要内保存对方信息(例如:IP,Port…)
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
二 三次握手
首先 上个典型的三次握手的图片展示
第一次握手:建立连接时,客户端发送syn包(syn=1
)到服务器,并进入SYN_SENT
状态,等待服务器确认;
第二次握手:服务器发给客户端,客户端知道自己发送、接收正常,服务器接收、发送正常。ACK=1,ack=x+1,SYN=1,seq=y
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1
),此包发送完毕,客户端和服务器进入ESTABLISHED
(TCP连接成功)状态,完成三次握手。
至此三次握手也就宣告完美结束
三 四次挥手
一样我们先把原理图给呈上来
第一次挥手: 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1
,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1
(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
第二次挥手: 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1
,并且带上自己的序列号seq=v
,此时,服务端就进入了CLOSE-WAIT
(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT
状态持续的时间。 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2
(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
第三次挥手: 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,
由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w
,此时,服务器就进入了LAST-ACK
(最后确认)状态,等待客户端的确认。
第四次挥手: 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1
,而自己的序列号是seq=u+1
,此时,客户端就进入了TIME-WAIT
(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCP后,才进入CLOSED
状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
面试问题
1 为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,服务端很可能并不会立即关闭 ,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
2 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答: 在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN, 那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。 如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
3 为什么不能用两次握手进行连接?
现在假定有两个计算机A和B之间进行通信,如果进行两次握手就存在一个问题,假设A和B初始列号一致,但B无法知道A是否已经收到自己的SYN,如果这个SYN丢失,则A和B的初始序号将无法达成一致,从而不能保证数据的可靠传输。
边栏推荐
- ~Introduction to form 80
- LeetCode 1641. Count the number of Lexicographic vowel strings
- 第6章 DataNode
- How to configure hosts when setting up Eureka
- Fdog series (VI): use QT to communicate between the client and the client through the server (less information, recommended Collection)
- The 116 students spent three days reproducing the ByteDance internal real technology project
- Two weeks' experience of intermediate software designer in the crash soft exam
- I'm "fixing movies" in ByteDance
- Ffmpeg command line use
- Saw local status change event StatusChangeEvent [timestamp=1644048792587, current=DOWN, previous=UP]
猜你喜欢
字节跳动技术新人培训全记录:校招萌新成长指南
Usage of insert() in vector
这116名学生,用3天时间复刻了字节跳动内部真实技术项目
Chapter 5 detailed explanation of consumer groups
Spark independent cluster dynamic online and offline worker node
Story of [Kun Jintong]: talk about Chinese character coding and common character sets
Solve the single thread scheduling problem of intel12 generation core CPU (II)
Mp4 format details
LeetCode 1560. The sector with the most passes on the circular track
Fdog series (V): use QT to imitate QQ to realize login interface to main interface, function chapter.
随机推荐
腾讯面试算法题
~84 form supplement
Chapter 5 detailed explanation of consumer groups
视频压缩编码和音频压缩编码基本原理
这群程序员中的「广告狂人」,把抖音广告做成了AR游戏
ByteDance open source Gan model compression framework, saving up to 97.8% of computing power - iccv 2021
Basic principles of video compression coding and audio compression coding
Record the error reason
QT system learning series: 1.2 style sheet sub control lookup
~83 form introduction
Spark independent cluster dynamic online and offline worker node
Monomer application concept
Chapter 7__ consumer_ offsets topic
两个礼拜速成软考中级软件设计师经验
Story of [Kun Jintong]: talk about Chinese character coding and common character sets
Chapter 5 yarn resource scheduler
~76 sprite map
Data config problem: the reference to entity 'useunicode' must end with ';' delimiter.
Some instructions on whether to call destructor when QT window closes and application stops
LeetCode 1638. Count the number of substrings with only one character difference