TCP连接的建立与终止
- 建立连接
- 第一次握手
- 第二次握手
- 第三次握手
- 终止连接
- 第一次挥手
- 第二次挥手
- 第三次挥手
- 第四次挥手
T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本文将详细讨论一个T C P连接是如何建立的以及通信结束后是如何终止的。
如何使用抓包工具 wireshark
建立连接
为了建立一个TCP连接:
第一次握手
- 请求端发送一个S Y N段指明连接的服务器的端口,以及初始序号(
ISN
)。这个SYN段为报文段1。
使用抓包工具得到以下内容,可以看到:- 指定了源端口和目标端口,什么?怎么没有
IP
地址,IP
地址在IP
首部呢! - 序号为
1514758884
,序号并不从0
开始,而是生成ISN
。序号为什么不从0开始? SYN=1
表明这是一个连接请求或连接接受报文- 窗口大小声明为
64240
- 指定了源端口和目标端口,什么?怎么没有
第二次握手
- 服务器发回包含服务器的初始序号的S Y N报文段(报文段2)作为应答。同时,将确认
序号设置为客户的I S N加1以对客户的S Y N报文段进行确认。一个S Y N将占用一个序号。
使用抓包工具得到以下内容,可以看到:- 指定了源端口(22)和目标端口(60378)
- 序号为
3444481880
ACK=1
,表明确认号ack
有效,ack=151475885
,即发来的报文序号1514758884+1
SYN=1
表明这是一个连接请求或连接接受报文- 窗口大小声明为
64240
第三次握手
- 客户必须将确认序号设置为服务器的I S N加1以对服务器的S Y N报文段进行确认(报文
段3)。
使用抓包工具得到以下内容,可以看到:- 同样指定了源端口和目标端口
- 序号为
1514758885
ACK=1
,表明确认号ack
有效,ack=3444481881
,即发来的报文序号3444481880+1
SYN=0
表明这不是一个连接请求或连接接受报文,服务器连接请求和连接接受发生在第二次握手时。- 窗口大小声明为
513
,为什么这么小呢?这个流量控制有关。
一个整体的流程图:
终止连接
建立一个连接需要三次握手,而终止一个连接要经过 4次挥手。这由T C P的半关闭(h a l f - c l o s e)造成的。一个T C P连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。
如图,为抓包工具显示内容:这就是四次挥手的过程。
第一次挥手
- 我从服务器进行断开连接的,故而先由服务器主动关闭连接。当一方完成数据传输并想要关闭连接时,它会发送一个FIN(结束)标志的数据包。这个FIN标志表示发送方已经完成了数据发送,但仍然可以接收数据。
第二次挥手
- 收到FIN标志的一方会在处理完剩余数据后,再发送一个带有ACK(确认)标志的数据包以确认收到了FIN。
第三次挥手
- 此时,如果应用程序不调用c l o s e而调用s h u t d o w n,且第2个参数值为1,则socket的A P I支持半关闭。显然,这不是一个半关闭。所以本地主机发送一个FIN(结束)标志的数据包至服务器。
第四次挥手
- 服务器确认(stream 主机->服务器 关闭连接)
一个完整的流程图: