`
欧阳晓
  • 浏览: 44656 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

三次握手和四次断开详解

阅读更多

TCP三次握手:

1 主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我.--------SYN

2 主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪佧序列号作为起始数据段来回应我.------返回ACKSYN

3 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了.--------再发ACK

有人想是不是当三次握手后,就开始建立了连接了呢?

这就要分请求者和被请求者。请求者是在收到SYNACK后就开始建立连接,而被请求者是在第三次握手后才建立连接。

四次断开:

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

1 当主机A完成数据传输后,将控制位FIN1,提出停止TCP连接的请求

2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,ACK1

3 B 端再提出反方向的关闭请求,FIN1

4 主机A对主机B的请求进行确认,ACK1,双方向的关闭结束.

ACK TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1,确认号才有效,ACK=0

,确认号无效,这时会要求重传数据,保证数据的完整性.

SYN 同步序列号,TCP建立连接时将这个位置1

FIN 发送端完成发送任务位,TCP完成数据传输需要断开时,提出断开连接的一方将这位置1

当我们用netsat –a命令时,我们看到state一栏,上面有LISTENSYN-SENTSYN-RECEIVEDESTABLISHEDFIN-WAIT-1FIN-WAIT-2CLOSE- WAITCLOSINGLAST-ACKTIME-WAITCLOSED这些到底是什么呢?到底是属于三次握手还是四次断开呢?

LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT -
在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED -
在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED-
代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 -
等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 -
从远程TCP等待连接中断请求;
CLOSE-WAIT -
等待从本地用户发来的连接中断请求;
CLOSING -
等待远程TCP对连接中断的确认;
LAST-ACK -
等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT -
等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED -
没有任何连接状态;

客户端TCP状态迁移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态迁移:
CLOSED->LISTEN->SYN
收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

参考文献:http://lavafree.iteye.com/blog/700885

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics