文章目录
一、TCP协议
1.1 TCP协议简介
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
- TCP是面向连接的、可靠的进程到进程通信的协议
- TCP提供全双工服务,即数据可在同一时间双向传输。
1.2 TCP报文格式
1.2.1 TCP报文段
- TCP将若干个字节构成一个分组,叫做报文段(Segment)
- TCP报文段封装在IP数据报中
- SYN(Synchronize Sequence Numbers):同步序列号,是TCP建立连接时候的握手信号,TCP需要建立连接时将该值设为1。
- ACK (Acknowledge character):确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误,当该位为1时,用于确认发送方的数据。
- RST(Reset the connection):复位标志,用于复位TCP连接。
- FIN(Finish):结束标志,用来结束TCP回话,当TCP断开连接时将该位置为1。
二、三次握手
2.1 TCP握手建立连接的过程
-
第一次:客户机(Client)发送连接请求即SYN=1,并发送随机Seq数据包,Seq=x;
-
第二次:服务端(Server)收到请求同意建立连接,发送自己的同步序列号SYN=1,并随机生成一个Seq数据包即Seq=y,并要回应Client的请求,ACK=1,Ack=x+1;
-
第三次:Client收到服务端同意建立连接请求的回复,发送ACK=1,Seq=x+1,Ack=y+1
完成以上三步后,TCP连接建立。
2.2 使用WireShark抓包验证四次握手
从图上可以看出,客户机与服务端是经过三次握手之后再开始传输数据的,前三个抓到的报文就代表了三次握手,我们来展开分析下:
三、四次挥手
3.1 四次挥手的过程
-
第一次:首先客户机想要断开连接,发送FIN=1,ACK=1报文来关闭数据发送
-
第二次:服务端收到FIN报文,回复报文ACK=1
-
第三次:服务端再次发送FIN=1,并发送ACK=1报文给服务端
-
第四次:客户端收到报文,回复ACK=1确认关闭连接
3.2 使用WireShark抓包验证四次挥手
五、疑问与思考
5.1 WireShark抓包四次挥手发现的问题
在使用X Shell工具进行对四次挥手进行抓包时一切正常,我后来又更换了一款SecureCRT 8.0软件进行连接抓包,只抓到如下三个报文,第一次是客户端发送的挥手报文,第二次是客户端发送的[RST,ACK]报文,第三次是服务端回复的ACK报文。
经过一番查询后找到了答案:
TCP连接关闭的正常方法是四次握手。但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送