tcp 三次握手/四次挥手/状态变迁

http://blog.chinaunix.net/uid-22312037-id-3575121.html

1 序号: seq 序号 用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记

2 确认序号: ack序号, 只有ack标志位为1时, 确认序列号才有效 ack = seq +1 

3标志位: 共6个,即URG,ACK,PSH,RST,SYN,FIN

   a URG: 紧急指针有效

   b ACK: 确认序号有效

   c PSH: 接收方应该尽快将这个报文交给应用层

   d RST: 重置连接

   e SYN: 发起一个新连接 

   f  FIN: 释放一个连接

 

三次握手: 指建立一个tcp连接,需要客户端和服务端总共发送3个包以确认连接的建立

 1. 第一次握手: client将标志位SYN置为1,随机产生一个值seq = J,并将该数据发送给server,client进入SYN_SENT状态,等待server确认

 2 第二次握手: server收到数据包后由标志位SYN=1知道client 请求建立连接,server将标志位SYN和ACK都置为1, ack = J + 1, 随机产生一个值seq = K,并将该数据包发送给client以确认连接请求, server进入SYN_RCVD状态

 3 第三次握手: client收到确认,检查ack是否为J+1, ACK是否为,如果正确则将标志位ACK置为1,ack = K+1, 并将该数据包发送给server, server检查ack是否为K+1, ACK是否为1,如果正确则连接建立成功, client和server进入ESTABLISHED状态,完成三次握手,随后client和server之间可以开始传输数据了

四次挥手: 即终止tcp连接,就是指断开一个tcp连接时,需要客户端和服务端总共发送4个包以确认连接的断开

 1. 第一次挥手: client发送一个FIN,用来关闭client到server的数据传送,client进入FIN_WAIT_1状态

 2. 第二次挥手: server收到FIN后,发送一个ACK给client,确认序号为收到序号+1,server进入close_wait状态

 3. 第三次挥手: server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态

 4. 第四次挥手: client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1, server进入CLOSE状态,完成四次挥手  

TCP三次握手,四次挥手的时序图:
 
tcp连接状态
   CLOSED: 初始状态,表示TCP连接关闭着或未打开的
   LISTEN: 表示服务端的某个socket处于监听状态,可以接受客户端的连接
   SYN_RCVD:  表示接收到SYN报文 
   SYN_SENT:  当客户端socket执行connect进行连接时,它首先发送SYN报文,然后随即进入到SYN_SENT状态,并等待服务端的的发送三次握手中的第2个报文
   ESTABLISHED:tcp连接建立成功
   FIN_WAIT_1: 当socket处于ESTABLISHED状态时,它向主动关闭连接,向对方发送FIN报文,此时该SOCKET进入到FIN_WAIT_1状态,当对方回应ACK报文后,则进入到FIN_WAIT_2状态
   FIN_WAIT_2: 表示半连接,即有一方调用close主动关闭连接 
   TIME_WAIT: 表示收到对方的FIN报文,并发送出ACK报文, TIME_WAIT状态下的TCP连接会等待2 * MSL(最大分段生存期,然后回到CLOSED可用状态 
   CLOSING: 表示双方同时close 一方发送FIN报文后,并没收到对方的ACK报文,反而却也收到对方的FIN报文,这时就会出现CLOSING状态
   CLOSE_WAIT: 表示正在等待关闭,对方close发送FIN报文给自己,自己回应一个ACK报文给对方,此时TCP连接进入CLOSE_WAIT状态,接下来你可以close并发送FIN报文给对方.即关闭自己到对方这个方向的连接 
   LAST_ACK: 当被动关闭的一方发送FIN报文后,等待对方ACK报文,就处于LAST_ACK状态,当收到对方的ACK报文后,也就可以进入到CLOSED可用状态了

posted on 2014-04-13 20:22  kangbry  阅读(258)  评论(0编辑  收藏  举报

导航