只要三次握手就能交上女朋友,单身的你还不进来看看
本篇博文参考以下文章
https://blog.****.net/qq_38950316/article/details/81087809
https://blog.****.net/qq_25948717/article/details/80382766
https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc
https://www.cnblogs.com/chenliyang/p/6558756.html
https://www.cnblogs.com/an-wen/p/11180076.html
讲个故事
举个例子,用一个具象的故事解释一下三次握手
网购:
- 有一天你开开心心在网上选择了一款商品,付完款后想催一下客服,快点发货,等不及了。
- 客服收到你的消息后,回复你 “明天配送可以吗”?
- 你看到这个消息后,很开心,对客服说 “好的”
- 客服收到你的确认消息后,安排发货
上面三处红字表示的地方,就是三次握手。
概念理解
配合图解可以更清晰了解到每部分都做了什么,下方图片可能比较乱,别着急,我们一步一来看
第一次握手
客户端:
主动打开之后,客户端会向服务器端发送一段TCP报文,其中:
- 标记位
SYN = 1
,表示“请求建立新连接” - 序号为
seq = x
- 然后客户端进入
SYN-SENT
阶段。
进入到SYN-SENT
之后,客户端就一直等待服务器的响应,此时是不知道服务器到底收没收到报文的,一直等,如果等待超时,会重新发送一份报文。
服务器:
服务器这边在被动启动之后,就会一直处于监听状态,对于所要监听的端口时刻保持高度集中,一旦收到客户端发来的信息,立马进行响应。
当收到SYN = 1
的标识后,服务器就明白了,客户端想建立连接,接下来就要准备第二次握手了。
第二次握手
服务器:
服务器收到请求后做两件事
-
1.赶紧告诉客户端,确认收到你的请求了(
SYN = 1
),可以建立连接(ACK = 1
),确认码是ack = x + 1
(收到的*** + 1),发送一个新的***(seq),这个***是发送给客户端的识别口令。 -
2.进入
SYN-SENT
阶段。
客户端:
- 在收到服务器返回的信息时,结束
SYN-SENT
阶段。
第三次握手
客户端:
- 这回握手告知服务端,确认收到服务端统一链接的信号(ACK),收到服务端的确认号(ack),并将其作为自己的***(seq)。
- 收到服务端的序号seq,并将值 + 1 作为自己的确认号(ack)。
- 结束
SYN-SENT
阶段。进入WESTABLISHED
阶段。
服务器:
- 收到消息后,明确链接正常,进入
WESTABLISHED
阶段
为什么需要三次握手
1.为了防止服务器端开启一些无用的连接增加服务器开销
- 比如只进行一次握手,如果服务器返回信息时丢失或者,客户端发送信息时丢失,那么客户端将无法收到返回值,超时之后重新发送。
2.防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
- 比如已经失效的客户端发出的请求信息,由于某种原因传输到了服务器端,服务器端以为是客户端发出的有效请求,接收后产生错误。
3.防止死锁
- 三次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始***进行协商,这个***在握手过程中被发送和确认。
- 如果只进行两次握手,服务端在发送确认链接后,不知道客户端是否收到消息,所以不认为链接建立,就会忽略客户端发来的任何消息,而客户端发来的所有消息都没有回应,故造成死锁。
以上便是对TCP三次握手的相关总结,接下来还有四次挥手的博文,请大家关注我的博客,
标题只是为了吸引眼球,请各位不要太过悲伤。