目录

  • 一、网络协议
  • (一)TCP
  • (二)HTTP
  • 二、wireshark抓包软件
  • (一)下载
  • (二)安装
  • 三、抓取数据包,验证协议
  • 四、总结
  • 参考文献


一、网络协议

(一)TCP

TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

1.TCP的特点

  • TCP是面向连接的运输层协议
  • 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
  • TCP提供可靠交付的服务
  • TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。
  • 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。

2.TCP头格式

  • Source Port(源端口号):数据发起者的端口号,16bit。
  • Destination Port(目的端口号):数据接收者的端口号,16bit。
  • Sequence Number(顺序号码,Seq):用于在数据通信中解决网络包乱序(reordering)问题,以保证应用层接收到的数据不会因为网络上的传输问题而乱序(TCP会用这个顺序号码来拼接数据),32bit。
  • Acknowledgment Number(确认号码,ack):是数据接收方期望收到发送方在下一个报文段的顺序号码(Seq),因此确认号码应当是上次已成功收到顺序号码(Seq)加1,32bit。
  • Offset(TCP报文头长度):用于存储报文头中有多少个32bit(上图的一行),存储长度为4bit,最大可表示(23+22+2^1+1)32bit=60bytes的报文头。最小取值5,532bit=20bytes。
  • Reserved(保留):6bit, 均为0
  • TCP Flags(TCP标志位)每个长度均为1bit
    (1)CWR:压缩,TCP Flags值0x80。
    (2)ECE:拥塞,0x40。
    (3)URG:紧急,0x20。当URG=1时,表示报文段中有紧急数据,应尽快传送。
    (4)ACK:确认,0x10。当ACK = 1时,代表这是一个确认的TCP包,取值0则不是确认包。
    (5)PSH:推送,0x08。当发送端PSH=1时,接收端尽快的交付给应用进程。
    (6)RST:复位,0x04。当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。
    (7)SYN:同步,0x02。在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
    (8)FIN:终止,0x01。当FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
  • 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。
  • 检验和:该字段检验的范围包括头部和数据这两部分。由发端计算和存储,并由收端进行验证。
  • 紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。
  • TCP选项:长度可变,最长可达40字节

3.TCP协议中的三次握手和四次挥手

  • 建立连接需要三次握手
    第一次握手:客户端向服务端发送连接请求包,标志位SYN(同步序号)置为1,顺序号码为X=0。
    第二次握手:服务端收到客户端发过来报文,由SYN=1知道客户端要求建立联机,则为这次连接分配资源。并向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始顺序号码Y=0,将确认序号(ack)设置为上一次客户端发送过来的顺序号(Seq)加1,即X+1 = 0+1=1。
    第三次握手:客户端收到服务端发来的包后检查确认号码(ack)是否正确,即第一次发送的Seq加1(X+1=1)。以及标志位ACK是否为1。若正确,服务端再次发送确认包,ACK标志位为1,SYN标志位为0。确认号码(ack)=Y+1=0+1=1,发送顺序号码(Seq)为X+1=1。Server收到后确认号码值与ACK=1则连接建立成功,可以传送数据了。
  • 断开连接需要四次挥手
    中断连接端可以是Client端,也可以是Server端。只要将下面两角色互换即可。
    第一次挥手:客户端给服务端发送FIN报文,用来关闭客户端到服务端的数据传送。将标志位FIN和ACK置为1,顺序号码为X=1,确认号码为Z=1。意思是说”我Client端没有数据要发给你了,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK过来。”
    第二次挥手:服务端收到FIN后,发回一个ACK(标志位ACK=1),确认号码为收到的顺序号码加1,即X=X+1=2。顺序号码为收到的确认号码=Z。意思是说“你的FIN请求我收到了,但是我还没准备好,请继续你等我的消息" 这个时候客户端就进入FIN_WAIT状态,继续等待服务端的FIN报文。
    第三次挥手:当服务端确定数据已发送完成,则向客户端发送FIN报文,关闭与客户端的连接。标志位FIN和ACK置为1,顺序号码为Y=1,确认号码为X=2。意思是告诉Client端“好了,我这边数据发完了,准备好关闭连接了。”
    第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认号码为收到的顺序号码加1,即Y+1=2。顺序号码为收到的确认号码X=2。意思是“我Client端知道可以关闭连接了,但是我还是不相信网络,怕 Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。“(在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。)

为什么关闭的时候却是四次挥(握)手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

(二)HTTP

HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

HTTP主要特点:

  • 支持客户/服务器模式。
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决这个问题, Web程序引入了Cookie机制来维护状态。

1.请求报文结构

报文中的数据都使用ASCII编码,各个字段的长度是不确定的(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

app双向认证抓包Python 双向验证抓包_数据


2.请求方法

app双向认证抓包Python 双向验证抓包_网络协议_02

关于HTTP请求GET和POST的区别

  • 提交形式
    GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中。
  • 传输数据的大小
    HTTP协议本身没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:
    GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。因此对于GET提交时,传输数据就会受到URL长度的限制。
    POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。
  • 安全性
    POST的安全性要比GET的安全性高,具有真正的Security的含义。而且通过GET提交数据,用户名和密码将明文出现在URL上,因为登录页面有可能被浏览器缓存,其他用户浏览历史纪录就可以拿到账号和密码了。

3.响应报文结构

app双向认证抓包Python 双向验证抓包_数据_03


4.响应状态码

  • 状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
    1xx:指示信息–表示请求已接收,继续处理。
    2xx:成功–表示请求已被成功接收、理解、接受。
    3xx:重定向–要完成请求必须进行更进一步的操作。
    4xx:客户端错误–请求有语法错误或请求无法实现。
    5xx:服务器端错误–服务器未能实现合法的请求。
  • 常用状态码
    200 OK:成功返回状态,对应,GET,PUT,PATCH,DELETE。
    201 created - 成功创建。
    302 Found:重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
    304 Not Modified:代表上次的文档已经被缓存了, 还可以继续使用。
    400 bad request - 请求格式错误。
    401 unauthorized - 未授权。
    403 forbidden - 鉴权成功,但是该用户没有权限。
    404 not found - 请求的资源不存在。
    405 method not allowed - 该http方法不被允许。
    410 gone - 这个url对应的资源现在不可用。
    415 unsupported media type - 请求类型错误。
    422 unprocessable entity - 校验错误时用。
    429 too many request - 请求过多。
    500 Internal Server Error:服务器发生了不可预期的错误。
    503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

二、wireshark抓包软件

Wireshark是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息。与很多其他网络工具一样,Wireshark也使用pcap network library来进行封包捕捉。可破解局域网内QQ、邮箱、msn、账号等的密码!!
wireshark的原名是Ethereal,新名字是2006年起用的。当时Ethereal的主要开发者决定离开他原来供职的公司,并继续开发这个软件。但由于Ethereal这个名称的使用权已经被原来那个公司注册,Wireshark这个新名字也就应运而生了。

Wireshark可以做什么

  • 网络管理员使用Wireshark检测网络问题
  • 网安工程师用Wireshark检查信息安全相关问题
  • 开发者使用Wireshark为新的通信协议调试
  • 普通用户使用Wireshark学习网络协议相关知识

(一)下载

Wireshark:官网下载地址

app双向认证抓包Python 双向验证抓包_tcp/ip_04


自行选择系统、版本下载

app双向认证抓包Python 双向验证抓包_tcp/ip_05

(二)安装

双击打开下载好的安装包文件

app双向认证抓包Python 双向验证抓包_tcp/ip_06


Next

app双向认证抓包Python 双向验证抓包_网络协议_07


I Agree

app双向认证抓包Python 双向验证抓包_tcp/ip_08


Next

app双向认证抓包Python 双向验证抓包_tcp/ip_09


Next

app双向认证抓包Python 双向验证抓包_网络_10


选择安装路径,Next

app双向认证抓包Python 双向验证抓包_tcp/ip_11


Next

app双向认证抓包Python 双向验证抓包_网络协议_12


Install

app双向认证抓包Python 双向验证抓包_网络_13


等待

app双向认证抓包Python 双向验证抓包_app双向认证抓包Python_14


跳出这个界面,点击I Agree

app双向认证抓包Python 双向验证抓包_tcp/ip_15


Install

app双向认证抓包Python 双向验证抓包_网络_16


Finish

app双向认证抓包Python 双向验证抓包_网络协议_17


安装已完成,Next

app双向认证抓包Python 双向验证抓包_网络协议_18


Finish

app双向认证抓包Python 双向验证抓包_网络_19

三、抓取数据包,验证协议

打开wireshark

app双向认证抓包Python 双向验证抓包_app双向认证抓包Python_20


查看自己的网络状态

app双向认证抓包Python 双向验证抓包_网络协议_21


app双向认证抓包Python 双向验证抓包_tcp/ip_22


选择网路

app双向认证抓包Python 双向验证抓包_tcp/ip_23


点击开始

app双向认证抓包Python 双向验证抓包_tcp/ip_24


点击统计,选择流量图

app双向认证抓包Python 双向验证抓包_数据_25


app双向认证抓包Python 双向验证抓包_网络协议_26


app双向认证抓包Python 双向验证抓包_tcp/ip_27

四、总结

抓包实际上是分析网络协议的一种过程,尽管繁琐的细节劳动都让抓包工具做了,但我们还是需要了解下基础的网络协议,好帮助我们更好的分析问题。
HTTPS是基于HTTP协议的一种改进,在TCP之上的会话层增加安全处理。对于应用层来说,HTTPS和HTTP没有什么不同,也就是说,HTTPS是保证网络传输的安全性,对业务数据无侵入。

参考文献