一、TCP/IP是一个协议族,每一层负责不通的通信功能,今天通过抓包分析一下传输层的TCP协议的三次握手过程。
二、使用抓包软件是Wireshark,先看一下Wireshark抓到的TCP的包对应的协议层。
Frame:对应是物理层,主要是传输bit流。
Ethernet:数据链路层,传输数据帧,二层通信主要是通过mac地址。
Internet:网络层,传送数据包, 互联网层IP包头部信息,
这一层通过抓包能够知道源IP和目的IP
Transmission:传输层,主要传送分组,传输层中的TCP、UDP协议
Hypertext:应用层,常用的HTTP、SMTP、FTP等协议
三、我们想要抓取握手包进行分析,首先来看一下TCP报文的首部。
1、源端口:是应用层进程所使用的端口,16bit
2、目的端口:通信另一端的进程所使用的端口,16bit
3、序号:发送分组时,将报文按字节编号,报文的第一个字节的序号就是序号,每一次放松报文的序号时由双方决定,也就是发送方报文的第一个字节序号。32bit
4、确认序号:是接收方期望发送方下一个报文的字节序号,加入A向B发送了一个报文,序号是x,如果B收到了这个报文,那么B发送了一个确认报文给A,将确认序号设置为x+1,表示前x个字节的数据我已经收到,你下次给我发从x+1开始的数据。
***5、 **首部长度:首部中32bit字的数目,可表示1532bit=60字节的首部。一般首部长度为20字节。
6、保留:6bit, 均为0
7、紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。
***8、 ***确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。
9、 推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。
10、 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。
11、同步比特SYN:在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
12、 终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
13、 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。
14、 检验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。
15、紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。
16、 选项:长度可变,最长可达40字节
分析三次握手过程###
关于抓包的过程就不再累述,不知道怎么抓包的可以看网上的教程。
我们想分析三次握手的过程,首先要能在众多的数据包(已经使用过滤器选出了所有TCP报文)中找到哪一个是第一次握手请求的数据包呢?
下面看一下抓的包。
图中箭头标注的地方可以看到这个报文中有SYN,下面两个报文分别有[ACK SYN] [ACK]很明显这是三次握手的过程。我们就来分析这三个包。
第一握手#####
我们将发送请求的一方暂且叫做客户端,TCP是全双工的通信。
客户端向服务器发送一个连接请求包,标志位SYN(同步)置为1,序号置为0.
第二次握手####
服务器收到客户端发来的报文,有SYN=1知道客户端是需要建立连接,于是向客户端发送一个确认包,置SYN=1 ACK=1。表名这是一个确认包。设置初始序号Y=0,将确认序号(Acknowledgement Number)设置为客户的序列号加1,即X+1 = 0+1=1。
第三次握手#####
客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,即第一次发送的序号加1(X+1=1)。以及标志位ACK是否为1。若正确,客户端再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。服务器收到后确认序号值与ACK=1则连接建立成功
四、到这,TCP连接的三次握手就已将建立了,下面就可以进行通信了。关于TCP三次握手过程中的seq和ack的含义初学者会感到困惑,不知道什么这些值的意义。关于TCP可靠传输的知识还有很多,需要多看书,去理解,比如如何保证TCP可靠传输,停等协议,ARQ协议,超时重传,流量控制,拥塞控制等知识都需要我们去理解。