TCP--三次握手 和 四次分手

来源:互联网 发布:淘宝天天乐游戏商城 编辑:程序博客网 时间:2024/04/29 18:06

首先咱们先来说一下,TCP包的格式,下面附上一张图:

TCP数据包可分为TCP 包头 和 来自应用层的数据 两部分,有6个标志位,即上图中的大写英文字母表示的,具体如下:

URG  紧急指针是否有效ACK 表示确认号是否有效,我们称携带ACK标志的TCP报文段为确认报文段PSH 标志,提示接收端应用程序应该立即从TCP接收区读取数据,为接收数据腾出空间。RST 表示要求对方重新建立连接,称携带RST的TCP报文段为复位报文段。SYN 表示请求建立一个连接,称携带SYN标志的TCP报文段为同步报文段。FIN  表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束段

三次分手

第一次:client发送SYN=1 seq=x到server,server由SYN=1知道client请求连接 第二次:server发送确认信息的包 到 client ack=x+1,SYN=1,ACK=1,seq=y第三次:client 检查ack是否等于x+1,ACK是否等于1,若正确,则发送 ack=y+1,ACK=1server ,server收到后确认则连接成功.seq:顺序序号ack:确认序号seq和ack分别来自TCP首部的序号字段和确认号字段,范围02^32-1

四次分手

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

1.client 发送一个 FIN,请求终端与server 的数据连接2.server 收到 FIN后,回复一个ACK 表示确认3.server 关闭与 client 的连接,发送一个FIN 给它4.client 发送一个 ACK报文确认

为什么 3次握手 而 分手是4次 呢?

因为server收到 SYN报文后,可以同时将SYN 和 ACK放到一个报文里来发回去,而关闭连接的时候,client发送一个FIN,仅代表它没有数据要发送到server了,即对方没有数据发送给你,而你未必没有东西发给对方,所以你未必会立刻关闭SOCKET,也许会将数据发送完后再发送FIN报文,再关闭。因此,大多情况下ACK 和 FIN是分开来发的。


有错误请指出,谢谢

1 0