三次握手
首先TCP是为了建立稳定的连接,所以双方都需要确认对方的接收能力和发送能力。
-
第一次握手:由客户端发送报文给到服务端
报文内容:SYN=1 seq=x
SYN是给服务端用来确认客户端的发送能力
seq是用来标记数据段的顺序,由本地随机生成的,这里用x代替客户端状态:已发送
服务端状态:监听 -
第二次握手:由服务端发送给客户端
报文内容:SYN=1 ACK=1 seq=y ack=x+1
SYN是给客户端用来确认服务端的发送能力
ACK是给客户端确认服务端的接收能力
seq是服务端本地随机生成的
ack是期待收到对方下一个报文段的第一个数据字节的序号客户端状态:已建立连接
服务端状态:已接收 -
第三次握手:有客户端发送给服务端
报文内容:ACK=1 seq=x+1 ack=y+1
客户端状态:已建立连接
服务端状态:已建立连接
简单来说就是
客户端:“能听见我说话吗”
服务端:“我听到了,你听到了吗”
客户端:“我也听到了”
好了,双方开始交流数据了
四次挥手
- 第一次挥手:客户端发送结束报文(客户端服务端都可以发起)
报文内容:FIN=1 seq=u
FIN用于通知服务端关闭连接
seq是用来标记数据段顺序
客户端状态:终止等待
服务端状态:数据传送
- 第二次挥手:服务端发送给客户端
报文内容:ACK=1 seq=v ack=u+1
ACK用于告知客户端,服务端已经接收到了
ack是指期待接收的下一个数据段序号
客户端状态:终止等待
服务端状态:关闭等待
- 第三次挥手:服务端发送给客户端
报文内容:FIN=1 seq=w ACK=1 ack=u+1
FIN用于告知客户端可以关闭连接了
客户端状态:时间等待
服务端状态:最终确认
- 第四次挥手:客户端发送给服务端
报文内容:ACK=1 seq=u+1 ack=w+1
客户端状态:时间等待(两个最大报文段生存时间之后关闭连接)
服务端状态:关闭连接
简单来说就是:
客户端:“不说了”
服务端:“等我说完先“
客户端:等待中
服务端:“我说完了”,挂电话了
客户端:“好嘞”,听一会,没声音了,挂电话