TCP(Transmission Control Protocol 传输控制协议) 是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。TCP在IP报文的协议号是6。
具体说明请参考:什么是TCP协议?
TCP连接的建立需要经过三次握手,连接的关闭需要经过四次挥手。
TCP的三次握手过程
① 如图所示
② 通过wireshark抓包分析
第一次握手
建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号Seq=x。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号Seq=X,表明传输数据时的第一个数据字节的序号是x)
第二次握手
服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包。(标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号Seq(服务器)=Y,以及服务器对客户端初始序号的确认号Ack(服务器)=Seq(客户端)+1=X+1)
第三次握手
客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(Seq=X+1),确认号为Ack(客户端)=Y+1,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。
TCP的四次挥手过程
① 如图所示
② 通过wireshark抓包分析
第一次挥手
首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号Seq=X。
第二次挥手
服务器收到这个FIN,它发送一个ACK,确认Ack为收到的序号加一(X+1)。
第三次挥手
关闭服务器到客户端的连接,发送一个FIN给客户端。
第四次挥手
客户端收到FIN后,并发回一个ACK报文确认,并将确认序号Seq设置为收到Ack序号。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
说明:
客户端发送FIN后,进入终止等待状态,服务器收到客户端连接释放报文段后,就立即给客户端发送确认,服务器就进入CLOSE_WAIT状态,此时TCP服务器进程就通知高层应用进程,因而从客户端到服务器的连接就释放了。此时是“半关闭状态”,即客户端不可以发送给服务器,服务器可以发送给客户端。
此时,如果服务器没有数据报发送给客户端,其应用程序就通知TCP释放连接,然后发送给客户端连接释放数据报,并等待确认。客户端发送确认后,进入TIME_WAIT状态,但是此时TCP连接还没有释放,然后经过等待计时器设置的2MSL后,才进入到CLOSED状态。
Fiddler 抓包包
如果想抓一个HTTPS包,wireshark能获取HTTPS,但不能解密HTTPS,因此需要用到工具Fiddler
具体的配置和使用方法,可参考:Fiddler抓包工具简介,安装及使用教程详解
其中抓取 “简书” 官网的效果如下: