【转】TCPIP协议中的三次握手和四次挥手
2016-02-17 23:57
302 查看
TCP_IP通信主要包含以下三个步骤(/阶段):
一、建立连接阶段 —— 三次握手
二、数据传输阶段
三、关闭连接阶段(/释放连接) —— 四次挥手
第一阶段:建立连接 (如下图)
![](http://img.blog.csdn.net/20160217220959745?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
① 客户端向服务端发送连接请求报文 → (SYN=1,seq = client_isn)
② 服务端接受客户端的连接请求并回复ACK报文及给此次连接分配资源。 → (SYN=1,seq = client_isn, ack = client_isn + 1)
③ 客户端接受来自服务端的ACK报文后,回复ACK报文给服务端并分配资源。 → (SYN=0,seq = server_isn, ack = server_isn + 1) // 图有误
第三阶段:断开连接 (如下图)
![](http://img.blog.csdn.net/20160217224030891?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
【注】 TCP连接的断开可以是服务端,也可以是客户端。
下面以客户端断开TCP连接为例说明。
① 客户端向服务端发送断开TCP连接的请求,即发送FIN报文。【这一步表明客户端没有数据要发送给服务端了】
② 服务端接受客户端的FIN报文后,由于可能还有数据未发送完成,因此先发送ACK报文。【这一步表明服务端已收到客户端的关闭连接请求,但服务端可能还有数据需要发送,让客户端等待消息】 —— 此时客户端进入FIN_WAIT状态,等待服务端的FIN报文。
③ 当服务端的数据发送完毕,就向客户端FIN报文。【这一步表明服务端数据发送完毕,准备好关闭连接了】
④ 客户端接受到服务端的FIN报文后,但仍不确定服务端是否清楚要关闭。因此接着发送ACK报文,直至服务端接收到为止。【这一步客户端发送完ACK报文后就进入TIME_WAIT状态】
服务端接受到客户端的ACK报文后,就断开连接。客户端等待2MSL依然没有收到回复则说明服务端已正常关闭,此时客户端也关闭连接。
OVER~TCP连接就正常关闭了。
整个TCP连接建立至断开的过程中,
客户端的状态变化
建立连接阶段:
发送SYN → SYN_SEND
接收SYN+ACK & 发送ACK → ESTABLISHED
断开连接阶段:
向服务端发送FIN → FIN_WAIT_1
接收服务端ACK → FIN_WAIT_2
接收服务端FIN & 发送ACK → TIME_WAIT
等待2MLS → CLOSED
服务端的状态变化
建立连接阶段:
监听套接字 → LISTEN
接收到客户端SYN & 发送SYN+ACK → SYN_RCVD
接收客户端ACK → ESTABLISHED
断开连接阶段:
接收FIN & 发送ACK → CLOSE_WAIT
发送FIN报文 → LAST_ACK
接收客户端ACK → CLOSED
参考:
TCP协议中的三次握手和四次挥手(图解)
在此表示感谢。
一、建立连接阶段 —— 三次握手
二、数据传输阶段
三、关闭连接阶段(/释放连接) —— 四次挥手
第一阶段:建立连接 (如下图)
① 客户端向服务端发送连接请求报文 → (SYN=1,seq = client_isn)
② 服务端接受客户端的连接请求并回复ACK报文及给此次连接分配资源。 → (SYN=1,seq = client_isn, ack = client_isn + 1)
③ 客户端接受来自服务端的ACK报文后,回复ACK报文给服务端并分配资源。 → (SYN=0,seq = server_isn, ack = server_isn + 1) // 图有误
第三阶段:断开连接 (如下图)
【注】 TCP连接的断开可以是服务端,也可以是客户端。
下面以客户端断开TCP连接为例说明。
① 客户端向服务端发送断开TCP连接的请求,即发送FIN报文。【这一步表明客户端没有数据要发送给服务端了】
② 服务端接受客户端的FIN报文后,由于可能还有数据未发送完成,因此先发送ACK报文。【这一步表明服务端已收到客户端的关闭连接请求,但服务端可能还有数据需要发送,让客户端等待消息】 —— 此时客户端进入FIN_WAIT状态,等待服务端的FIN报文。
③ 当服务端的数据发送完毕,就向客户端FIN报文。【这一步表明服务端数据发送完毕,准备好关闭连接了】
④ 客户端接受到服务端的FIN报文后,但仍不确定服务端是否清楚要关闭。因此接着发送ACK报文,直至服务端接收到为止。【这一步客户端发送完ACK报文后就进入TIME_WAIT状态】
服务端接受到客户端的ACK报文后,就断开连接。客户端等待2MSL依然没有收到回复则说明服务端已正常关闭,此时客户端也关闭连接。
OVER~TCP连接就正常关闭了。
整个TCP连接建立至断开的过程中,
客户端的状态变化
建立连接阶段:
发送SYN → SYN_SEND
接收SYN+ACK & 发送ACK → ESTABLISHED
断开连接阶段:
向服务端发送FIN → FIN_WAIT_1
接收服务端ACK → FIN_WAIT_2
接收服务端FIN & 发送ACK → TIME_WAIT
等待2MLS → CLOSED
服务端的状态变化
建立连接阶段:
监听套接字 → LISTEN
接收到客户端SYN & 发送SYN+ACK → SYN_RCVD
接收客户端ACK → ESTABLISHED
断开连接阶段:
接收FIN & 发送ACK → CLOSE_WAIT
发送FIN报文 → LAST_ACK
接收客户端ACK → CLOSED
参考:
TCP协议中的三次握手和四次挥手(图解)
在此表示感谢。
相关文章推荐
- 蓝懿IOS网络协议API
- TCP/IP协议簇
- http请求 get post
- 基于netty的网络聊天室(一)——基础框架搭建
- linux下通过网络获取本机时间
- 网络流之最大流 EK/Dinic/Isap算法 学习笔记
- HTTP状态码详解
- 出现chkstk.asm问题的解决方式之一http://blog.csdn.net/feixuedudiao/article/details/8625039
- 高性能浏览器-HTTP 2.0
- HTTP 状态消息
- HTTP协议详解
- [转]Android各大网络请求库的比较及实战
- Volley网络框架
- C# 简单Tcp通信demo
- BZOJ_P2561 最小生成树(网络流+最大流ISAP)
- 网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据
- Android 手机自动化测试工具有哪几种? http://www.zhihu.com/question/19716849
- 一个网络传输框架——zeroMQ 调研笔记
- HttpUrlConnection get和post简单实现(疑惑解决)
- CentOS6.5无线网卡驱动及其网络参数配置