计算机网络三次握手抓包分析,【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手...

【摘要

】本文重点分析计算机网络中TCP协议中的握手和挥手的过程。

【前提说明】

前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需要复习一下网络知识,于是就有这篇博文的诞生。当然网上关于TCP相关的知识点也是芸芸,闲着无事也可以多google深入理解一下,本文重点在分析TCP协议中的握手和挥手的过程。

【抓包前准备】

既然要抓包,我的装备是个人电脑,操作系统是Mac OS。抓包工具是wireshark,至于怎么安装和一些基本的操作,可以点击参考这篇文章。

用本地电脑模拟server和client,都是localhost的地址,但是我选择的是不同的端口进行标识。server的端口号:12345;client的端口号:50784。因为是用的本机做的实验,所以wireshark监听的不是网卡而是Loopback:lo0,如图所示:

f5b4a03efd4cd4d853e220c7ad5ce10c.png

以下是我模拟client和server的代码:

1)server端

-Python 代码

01

#! /usr/bin/python

02

# -*- coding: utf-8 -*-

03

04

import socket

05

06

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

07

08

server_address = ('127.0.0.1', 12345)

09

print "Starting up on %s:%s" % server_address

10

sock.bind(server_address)

11

12

sock.listen(1)

13

14

while True:

15

print "Waiting for a connection"

16

connection, client_address = sock.accept()

17

18

try:

19

print "Connection from", client_address

20

21

data = connection.recv(1024)

22

print "Receive '%s'" % data

23

finally:

24

connection.close()

2)client端-Python 代码

01

# /usr/bin/python

02

# -*- coding: utf-8 -*-

03

04

import socket

05

06

def check_tcp_status(ip, port):

07

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

08

09

server_address = (ip, port)

10

print 'Connecting to %s:%s.' % server_address

11

sock.connect(server_address)

12

13

message = "I'm TCP client"

14

print 'Sending "%s".' % message

15

sock.sendall(message)

16

17

print 'Closing socket.'

18

sock.close()

19

20

21

if __name__ == "__main__":

22

print check_tcp_status("127.0.0.1", 12345)

代码比较简单,就是模拟了一次链接,可以多次执行client,client只要链接成功就会发送一句话“I'm TCP client”,server一直死循环监听端口,并将接受到的信息打印到console中。

867f089030960c1fe092c5ecdce2b0ef.png

【结果分析】

看到上面的console输出之后,我们看一下wireshark抓到的结果:

c7f8ae104b5e89010b3058654d450b40.png

我用两种颜色标了出来,可以看到黄色框中的序号为1、2、3的三次通信过程其实就是我们说的三次握手;握手建立之后的序号为4、5、6便为传输数据的过程;而序号7、8、9、10就是我们所说的四次挥手的过程。

我们再进一步细看下握手、挥手这俩过程。

三次握手

293acdf4cff461a997edd7fa9b977564.png

我们来总结一下握手的规律:

第一次握手:建立链接。客户端发送链接的请求,发送SYN报文,将Seq设置为0。然后客户端就进入了SYN_SEND状态,等待服务器的确认。

第二次握手:服务器收到客户端的SYN报文段。需要对这个SYN报文段进行确认,发送ACK报文,并将Ack设置为1。同时,自己也要发送SYN请求信息,将Seq设置为0,。服务器将上述的所有信息一并发送给客户端,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的ACK和SYN报文后,进行确认,然后将Ack设置为1,Seq设置为1,向服务器发送ACK报文段,这个报文段发送完毕之后,客户端和服务器都进入了ESTABLISHED状态。就此完成了TCP的三次握手。

四次挥手

6cb77d50f2039d748d1b1e8f8f99d24c.png

接着总结下挥手的规律:

第一次挥手:客户端想服务器发送一个FIN报文段,将设置Seq为15和Ack为1。此时客户端进入FIN_WAIT_1状态。这表示客户端没有数据要发送服务器了,请求关闭连接。

第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,Ack设置为16,Seq设置为1;服务器进入了CLOSE_WAIT状态,客户端收到服务器返回的ACK报文之后随即进入FIN_WAIT_2状态。

第三次挥手:服务器会观察自己是否还有数据没有发送给客户端,如果有,先把数据发送给客户端,再发送FIN报文;如果没有,那么服务器直接发送FIN报文给客户端。请求关闭连接,同时服务器进入LAST_ACK状态。

第四次挥手:客户端收到服务器发送的FIN报文,向服务器发送ACK报文,将Seq设置为16,Ack设置为2,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文之后就关闭了连接;此时,客户端等待2msl后依然没有收到回复,则证明服务器已正常关闭,客户端也可以关闭连接了。

注意个规律: 每次一方返回ACK报文的时候,设置Ack=对方传来的Seq值+1。

【理解TCP/IP模型】

说完TCP协议之后,不能免俗的要聊一下TCP/IP协议模型,该模型是计算机网络的经典的模型了。该模型由OSI模型演化而来,由原来的7层简化为了5层,具体如下图所示:

af004ec16f3508d9294106bfde4a9220.png

TCP/IP协议被称为传输控制协议/互联网协议,又称网络通讯协议(Transmission Control Protocol)。是由网络层的IP协议和传输层的TCP协议组成,是一个很大的协议集合。

物理层和数据链路层没有定义任何特定协议,支持所有的标准和专用的协议。

网络层定义了网络互联也就是IP协议,主要包括IP、ARP、RARP、ICMP、IGMP。

传输层定义了TCP和UDP(User Datagram Protocol),我们会后面重点介绍一下TCP协议。

应用层定义了HTTP(超文本传输协议)、FTP(文件传输协议)、DNS(域名系统)等协议。

TCP/IP的网络模型分层思想算是非常有借鉴性的系统分层思想。映射到我们的软件系统上来看,其实我们的软件系统更多的时候也需要考虑分层,层次之间通过接口来交互。在严格的分层系统里,内部的层只对相邻的层次可见,这样就可以将一个复杂问题分解成增量步骤序列。由于每一层最多只影响两层,也给维护带来了很大的便利。

参考资料:

4a9691b11ab4e4eef675fa6be669acde.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值