一、ACK、SYN、FIN等标识位
ACK (Acknowledge character,确认字符)在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
SYN(synchronization,同步) 在连接建立时用来同步序号。SYN:同步序列编号(Synchronize Sequence Numbers)。 当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1。 因此, SYN置1就表示这是一个连接请求或连接接受报文。
FIN (finis,终结) 用来释放一个连接。 当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
URG: 紧急指针( urgent pointer)有效。
PSH: 接收方应该尽快将这个报文段交给应用层。
RST: 重建连接。
窗口大小:用于流量控制。
二、整体过程说明图
三、三次握手
三次握手的核心是: 确认每一次包的序列号。
tcp三次握手过程:
1、首先由Client发出请求连接即 SYN=1,声明客户端序号是 seq=x(随机产生)
2、然后Server 进行回复确认,即 SYN=1 ,声明服务端序号是 seq=y(随机产生),并设置为ACK=x+1
3、最后Client 再进行一次确认,设置 ACK=y+1
TCP连接状态详解:
服务器端:LISTEN:侦听来自远方的TCP端口的连接请求
客户端:SYN-SENT:在发送连接请求后等待匹配的连接请求
服务器端:SYN-RECEIVED:在收到和发送一个连接请求后等待对方对连接请求的确认
客户端/服务器端:ESTABLISHED:代表一个打开的连接
四、四次挥手
假设Client端发起中断连接请求,也就是发送FIN报文。
Server端接到FIN报文后,意思是说我Client端没有数据要发给你了,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。
所以你先发送ACK,告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。
这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端,好了,我这边数据发完了,准备好关闭连接了。
Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。
端收到ACK后,就知道可以断开连接了。 Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。
Ok,TCP连接就这样关闭了!
五、数据包的大致结构
第一行:数据包整体概述, 第二行:链路层详细信息,主要的是双方的mac地址(关注mac) 第三行:网络层详细信息,主要的是双方的IP地址(关注IP) 第四行:传输层的详细信息,主要的是双方的端口号(关注端口号)。
六、Wireshark中看TCP三次握手、四次断开
模拟一下tcp会话建立
我们通过Xshell远程连接Kali Linux就会捕获到完整的TCP3次握手的链接。
先清空数据包然后筛选tcp开始抓包
三次握手
到这里三次握手过程就结束了
流程图显示
前面3个就是TCP建立链接的过程,后面的就是相互通信的过程了这个时候seq就会根据数据包的大小改变。 清空数据包来看一下断开链接是一个什么样的过程
四次挥手
流程图显示 把窗口拉到最下面只看4个数据包 过程: 我们在终端输入EXIT实际上是在我们Kali 上执行的命令,表示我们SSHD的Server端向客户端发起关闭链接请求。
第一次挥手:服务端发送一个[FIN+ACK],表示自己没有数据要发送了,想断开连接,并进入FIN_WAIT_1状态。
第二次挥手: 客户端收到FIN后,知道不会再有数据从服务端传来,发送 ACK进行确认,
确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),客户端进入CLOSE_WAIT(关闭等待)状态。
第三次挥手: 客户端发送[FIN+ACK]给对方,表示自己没有数据要发送了,
客户端进入LAST_ACK状态,然后直接断开TCP会话的连接,释放相应的资源。
第四次挥手: 服务户端收到了客户端的FIN信令后,进入TIMED_WAIT状态,并发送ACK确认消息。
服务端在TIMED_WAIT 状态下,等待一段时间,没有数据到来,就认为对面已经收到了自己发送的ACK并正确关闭了进入CLOSE状态,
自己也断开了TCP 连接,释放所有资源。当客户端收到服务端的ACK回应后,会进入CLOSE状态并关闭本端的会话接口,释放相应资源。
参考链接
网络基础之网络协议篇——Egon林海峰老师
|