1、前言
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。
面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。本文将分别讲解经典的TCP协议建立连接(所谓的“3次握手”)和断开连接(所谓的“4次挥手”)的过程。有关TCP协议的权威理论介绍,请参见《》这本书。(本文同步发布于:)2、学习交流
- 即时通讯开发交流群: [推荐]
- 移动端IM开发推荐文章:《》
3、相关资料
《》
《 - 》 《 - 》 《 - 》 《》 《》 《》 《》4、先来认识TCP报文格式
TCP/IP协议的详细信息参看《》中有关TCP格式的章节()。
下面是TCP报文格式图:![](https://static.oschina.net/uploads/space/2016/0926/165516_55IW_737747.png)
5、3次握手过程详解
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
![](https://static.oschina.net/uploads/space/2016/0926/165533_NFJu_737747.png)
1 |
|
6、4次挥手过程详解
三次握手耳熟能详,四次挥手估计就少有人知道了。所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
![](https://static.oschina.net/uploads/space/2016/0926/165553_emXw_737747.png)
- 第一次挥手: Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手: Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手: Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手: Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
![](https://static.oschina.net/uploads/space/2016/0926/165608_mu6k_737747.png)
7、结语
关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:
- (1) 三次握手是什么或者流程?四次握手呢?答案前面分析就是。
- (2) 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
(本文同步发布于:)
附录:更多IM技术文章
[1] 网络编程基础资料:
《》 《》 《》 《》 《》 >> [2] 有关IM/推送的通信格式、协议的选择: 《》 《》 《》 《》 《》 《》 《》 《》 >> [3] 有关IM/推送的心跳保活处理: 《》 《》 《》 《》 《》 《》 《》 >> [4] 有关WEB端即时通讯开发: 《》 《》 《》 《》 《》 《》 >> [5] 有关IM架构设计: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 >> [6] 有关IM安全的文章: 《》 《》 《》 《》 《》 《》 《》 《》 >> [7] 有关实时音视频开发: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 >> [8] IM开发综合文章: 《》 《》 《》 《》 《》 《》 《》 《》 《》 >> [9] 开源移动端IM技术框架资料: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 >> [10] 有关推送技术的文章: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 >> [11] 更多即时通讯技术好文分类:作者: (点击作者姓名进入Github)
出处: 交流:欢迎加入即时通讯开发交流群 讨论: Jack Jiang同时是和的作者,可前往下载交流。