当使用TCP协议的应用程序需要向服务器获得资源的时候,就需要通过TCP协议去建立一种关系,这个关系维系了客户端与服务器之间的通信。握手的主要目的,就是为了提供高可靠的信息沟通机制!确保沟通的顺畅!防止失效的连接对服务器造成困扰!
当我们打电话的时候,往往都是这样子:
张三:你好我是张三!请问是李四么,
李四:你好张三,我是李四!你有什么事么???
张三:你好李四,我想问你个问题!XXXXXX。。。
下面我们用图来说明TCP建立连接的步骤!例如我用电脑浏览器,访问www.liujinghui.com。
第一步:客户端发送请求连接服务器的报文
报文:
ACK(确认序号有效标记位):0
SYN(发起一个新连接):1
seq(标明我当前发送数据包的序列号):x
第二步:服务器监听程序收到了客户端发来的请求报文
报文:
ACK(确认序号有效标记位):1
SYN(发起一个新连接):1
seq(标明我当前发送数据包的序列号):y
ack(确认对方序列号并希望获得下一个序列号的数据包) =x+1
第三步:客户端收到了服务器发来的回话!进行最后一次确认!
报文:
ACK(确认序号有效标记位):1
seq(标明我当前发送数据包的序列号,+1表示下一个数据包):x+1
ack(确认对方序列号并+1表示希望获得下一个序列号的数据包) =y+1
======上述活动完成后tcp连接即可建立!======
========通信ing......=======
========通信ing......=======
========通信ing......=======
========通信ing......=======
========通信ing......=======
======上述通信完成后断开tcp连接! ======
第一步:客户端给服务器发送FIN包,要求关闭客户端到服务器的数据连接。
报文:
FIN(要求释放连接):1
ACK(确认序列号有效):1
seq(当前的数据包):m
ack(期待获得的服务器数据包):n
第二步:服务器收到FIN后,发回一个标志位ACK=1,确认序号为收到的序号加1,希望获得回复,本次发送序号为收到的客户端发来的确认序号n。
报文:
ACK(序列号有效):1
seq(本报文包序列号):n
ack(希望获得的确认包序列号):m+1
第三步:服务器接着发送FIN报文包,希望断开连接,并等待收到客户端回复
报文:
FIN(要求释放连接):1
ACK(确认序列号有效):1
seq(发送自己新的序列号):x
ack(希望客户端回复包的序列号):m+1
第四步:客户端确认过眼神 是该分手的人!
报文:
ACK(确认序列号有效):1
seq(发送自己的回复包序列号):m+1
ack(对方确认包序列号):x+1