上一篇文章通过wireshark抓包工具简单了解了TCP/IP协议的五层工作模型,其中传输层我们已经知道主要是用来增加端口信息的。传输层主要有两种协议,一种是面向连接的TCP协议,一种是无连接的UDP协议,无连接的UDP协议比较好理解,比如我们刷抖音,看视频,基本都是UDP协议,udp协议传输速度快,但不能保证数据的完整性,我们刷抖音的时候,如果网络有波动,即使丢失了一些画面,影响也很小,可以说基本没有影响,但是如果在一些前后端的交互中,比如淘宝购物下单支付的场景,就必须要保证数据的完整性和安全性。TCP面向连接的协议对比UDP协议,虽然传输速度不如UDP,但很好的保证了数据传输过程中的完整性。
TCP协议是面向连接的,那么在计算机的传输过程中,具体是如何建立面向连接,就有必要深度学习一下TCP的三次握手和四次挥手,在渗透测试工作中,理解三次握手和四次挥手还是很有必要的。
SYN 表示建立连接
FIN 表示关闭连接
ACK 表示响应
PSH 表示有 DATA 数据传输
RST 表示连接重置。
SEQ分为相对序列号和绝对序列号,默认是相对序列号显示就是0 1不便于查看,可以修改成绝对序列号方法:
编辑-》首选项》Protocols》TCP,标识位置去掉打勾,点击确定
三次握手的过程:
以下为192.168.3.67访问192.168.3.38
第一次握手:67向38发起SYN包,SYN包的意思是建立连接,举个例子:我们准备去朋友家取东西,最开始要询问一下朋友是否在家,如果在家可以去取东西,如果朋友不在家那么不就白跑一趟了。对于第一次握手的过程来说,就是询问朋友是否在家,这时候我们会发送一个叫做seq的东西,这个东西会随机有一个序列号。
第二次握手:67向38发起SYN后,38如果接收到syn包后,是不需要回复一下,回到上边的例子,询问朋友是否在家,朋友是不要回复一下是否在家?在第一次握手的时候,看下边的截图,67发送了一个带有序列号的seq(1860051053),那么38呢,如果确认在家,就回复一个ACK响应包,ACK包也有一个序列号,这个序列号就是在seq序列号的基础上加1,就表示确认的是67的请求,如下图所示ACK的序列号是(1860051053+1=1860051054),同时也会发送一个带有随机序列号的SEQ(859377400)给67,那么为什么38为什么也要发送一个SEQ,回到去朋友家的例子上,我们询问朋友是否在家,朋友回复说在家后,为了保证这次见面顺利,朋友是不也得确认一下你确定要过来?
第三次握手:67收到38发过来的确认ACK响应包,以及需要回复的SYN包后,67需要最终确认是否建立连接,这时候回复一个ACK响应包给38,即在38发送的SYN包序列号的基础上加1(859377400+1=859377401)。回到上边的例子中,朋友确认在家后,询问我们是否确定过来时,我们给了朋友一个答复:肯定过去,至此,一个拜访的约定就确认完毕。对于TCP协议来说,就是建立好了一个连接,接着就可以做数据的传输了,发送PSH包。
四次握手的过程:
三次握手建立连接,数据传输完成后,就是四次挥手断开连接的过程。
第一次挥手:67收到38发送的所有数据后,不需要再维持连接了,这时候就会发送一个带有序列号的FIN包断开连接(一起的ACK包可以理解为是建立链接,传输数据过程中的响应包),回到例子中,我们从朋友家取上了物品(加入是多个物品),要和朋友告别:东西我都拿上了,我要回去了,这就是第一次挥手
第二次挥手:我们和朋友告别,朋友先说好的,但是还没有说再见(没有发送FIN包)-这里假如你和朋友已经有个约定,每次见面,必须互相说再见才能离开。对于TCP协议来说,就是回复一个ACK包,序列号也是在收到的FIN包的seq序列号上加1。
第三次挥手:第二次挥手时,朋友说好的之后,没有说再见,那么这次就是说再见了,对于TCP协议来说,就是也发送一个FIN包,同时也会同时发送一个ACK包。这种机制是为了保证接收数据的完整性,回到例子中,我们取了多个物品后和朋友再见,朋友说好的之后还没有说再见,说再见之间我们还有时间检查一下物品的数量对不对,而在朋友说了再见之后,可能朋友有事马上就出门了,如果物品有差错,我们也没有机会拿取物品了。
第四次挥手:朋友说了再见之后,要求我们给一个回应,确认要再见,没有其他事了吧(这样看来不像拜访朋友,像接头哈)。对于TCP来说,就是67再发送一个ACK响应包,确认断开连接,38收到响应后便会断开连接。
总结:以上就是三次握手和四次挥手的过程。实际上TCP协议建立连接,传输数据,释放连接时,还有其他很多的控制措施,确保数据传输的效率、完整性、安全性等。作为渗透测试人员,先了解基本的建立连接和释放连接的过程就可以,后续随着学习的累积,再继续深入学习TCP协议。