原理
1、网络协议(network protocol)
网络协议(network protocol)简称为协议,是为进行计算机网络中的数据交换而建立的规则、 标准或约定。协议规定了通信实体之间所交换的消息的格式、意义、顺序以及针对收到信息或发生事件所采取的“动作”(actions) 。
2、计算机网络体系结构
计算机网络体系结构是指计算机网络层次结构模型,它是各层的协议以及层次之间的端口的集合。在计算机网络中实现通信必须依靠网络通信协议,当前主流的体系结构有三种,分别是OSI七层结构(广泛采用的是国际标准化组织(ISO)1997年提出的开放系统互联(Open System Interconnection,OSI)参考模型,习惯上称为ISO/OSI参考模型。),TCP/IP参考模型,以及Internet五层协议栈。
开放系统互连(Open System Interconnect,OSI)参考模型是由国际标准化组织(ISO) 1984年提出的分层网络体系结构模型。目的是支持异构网络系统的互连互通,是理解网络系统的最佳模型或学习工具。分为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层七层,每层完成特定的网络功能。
OSI是一个理论上的网络通信模型,TCP/IP则是实际运行的网络协议;TCP/IP协议族分为四层,分别为应用层,传输层,网络层,网络接口层。
Internet五层协议栈综合了OSI七层模型和TCP/IP四层模型的优点,包括:应用层、运输层、网络层、数据链路层和物理层。
应用层:是体系结构中的最高。直接为用户的应用进程(例如电子邮件、文件传输和终端仿真)提供服务。支持各种网络应用。
运输层:负责向两个主机中进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能。【进程—进程的数据传输(TCP,UDP)】
网络层:源主机到目的主机的数据分组与转发(IP 协议,路由协议等)。
数据链路层:常简称为链路层,我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间传送数据是直接传送的(点对点),这时就需要使用专门的链路层的协议。【相邻网络元素的数据传输】
物理层:在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。
3、Encapsulation 封装
封装Encapsulation,由上到下在每一层数据增加控制信息(Header),构造协议数据单元(PDU),包括:地址(Address):标识发送端/接收端;差错检测编码(Error-detecting Code):用于差错检测或纠正
协议控制(Protocol control):实现协议功能的附加信息。
解封装,就是封装的逆过程,拆解协议包,由下到上去除报头,数据封装和解封装是一对逆过程。
五层协议栈的封装和解封装过程如下:
封装过程
应用层:原始数据被转换成二进制数据
传输层:二进制数据被分割成小的数据段,并封装TCP头部 (数据段)(TCP头部的关键信息–端口号)
网络层:传输层传来的数据被封装上IP头部 (数据包)(IP头部的关键信息–IP地址)
数据链路层:网络层传来的数据被封装上MAC头部 (数据帧)(MAC头部的关键信息–MAC地址)
物理层:二进制数据组成的比特流转化为电信号在网络中传输 (比特流)
解封装(封装的逆过程)
五层协议栈的封装和解封装过程如下:
4、应用层协议
应用层协议(application layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。包含:消息的类型(type){请求消息,响应消息};消息的语法(Syntax)格式{消息中有哪些字段(field),每个字段如何描述};字段的语义(semantics){字段中信息的含义};规则(rules){进程何时发送/响应消息,进程如何发送/响应消息}
典型网络应用服务与协议主要有:
1)域名系统(Domain Name System,DNS):主要提供域名和IP地址之间映射。
2)文件传输协议(File Transfer Protocol,FTP):在互联网的两个主机间实现文件互传的网络应用。
3)超文本传输协议(HyperText Transfer Protocol,HTTP):用于实现WWW服务,也就是WEB服务。
4)SMTP(Simple Mail Transfer Protocol), 使用TCP进行Email消息的可靠传输。
5)POP3(Post Office Protocol 3), 提供从服务器获取邮件的服务。
5、DNS协议
DNS协议是用来将域名解析到IP地址的一种协议,也可以用来将IP地址转换为域名。DNS协议是基于UDP和TCP的协议,使用53端口。只有在区域传输时才使用TCP协议,在其他时候使用的是UDP协议。
6、HTTP(超文本传输协议)
HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。所有的HTTP报文都分为两类:请求报文和响应报文。
7、SMTP即简单邮件传输协议
SMTP即简单邮件传输协议是一组由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议。运行在发送端邮件服务器主机上的SMTP客户,发起建立一个运行在接收端邮件服务器主机上的SMTP的服务器端口25号之间的TCP链接。
8、POP3协议
POP3协议即“邮局协议版本3”,和SMTP一样属于TCP/IP协议。POP3协议主要用于支持使用客户端远程管理在服务器上的电子邮件。POP3协议还支持离线处理,不需要收件人同时在线。
9、Internet提供的传输服务TCP与UDP
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流、可进行流量控制的、提供拥塞控制的传输层通信协议。
UDP (User Datagram Protocol数据报协议)一种无连接的传输层协议,提供简单不可靠信息传送服务。
TCP与UDP在传输层为应用层服务和程序提供传输服务。
10、Socket
网络上的程序进程间通信利用socket发送/接收消息实现,进程的标识符IP地址+端口号。
11、Port
由于系统加载后服务与程序其进程号是按加载顺序排序的,因此通信的两台主机很难通过进程号找到对方,逻辑上提出了一个Port(端口)的概念(仅限于TCP与UDP传输过程),该概念将逻辑上同一类的服务和APP归结到一个通信出口,通信另一端通过一个随机选择大于 1024 以上(因为0-1023用作知名服务器的端口,如FTP21、HTTP80、SMTP25、TELNET23、SSH22)的端口向固定服务的端口(1024以下固定服务)发起通信请求。如:
源10.84.218.106通过63366向目的40.100.54.34的443发起加密https(443)请求
源10.84.218.106通过62850向目的182.250.178.82的80发起http(80端口)请求
主要内容以及使用的设备以及软件
下面会根据以下内容进行实验
1、使用wireshark、sniffer等捕捉工具捕捉应用层通信报文。
2、对报文在每一层的封装进行分析,特别是DNS、HTTP、FTP与Email协议,对端口复用与分解、应用层服务与协议的通信过程进行分析。
3、对HTTP协议的请求-响应过程及协议数据封装进行详细分析,编写一个页面,能够记录客户端User-Agent信息,并根据访问请求的User-Agent返回不同内容;并熟练使用session和cookie
验证
1、DNS\HTTP\SMTP\POP\SMTP报文捕捉截图
①DNS报文捕捉截图。
首先打开wireshark选择正在上网的网卡,然后找到百度网站,然后便可以捕捉到DNS报文。
图1:DNS报文捕捉截图
②HTTP报文捕捉截图。
在wireshark的应用显示过滤器中输入HTTP即可找到HTTP报文。
图2:HTTP报文捕捉截图
③SMTP报文捕捉截图。
SMTP需要通过发送邮件来捕捉,所以需要安装Foxmail。进入Foxmail后选择邮箱的类型为POP3(如果邮箱类型不是POP3,点击左下角新建),并将两个SSL的勾去掉。
图3:设置邮箱类型
先打开wireshark选择正在上网的网卡,然后在Foxmail上正常发送邮件,即可获取SMTP报文。
图4:SMTP报文捕捉截图
④POP报文捕捉截图。
在Foxmail上发送邮件,并收取,就能捕捉到POP报文。
图5:POP报文捕捉截图
⑤FTP报文捕捉截图。
在windows系统使用FTP Server搭建FTP服务器,下图所示为搭建FTP服务器后捕捉到的登陆和下载数据(使用ftp过滤)。
图6:FTP报文捕捉截图
2、Internet五层协议栈报文封装分析,字节计算。
图7:Internet五层协议
如图7所示从上到下分别是,物理层,数据链路层,网络层,传输层,应用层。
图8:DNS query
图9:UDP头部
传输层的UDP头部,长度8,包含了源端口,目的端口,长度,校验和。
图10:网络层头部
图11:以太帧头部
数据总长度= 33(DNS query)+ 8(UDP头部)+ 20(网络层头部)+ 14(以太帧头部)=75Bytes=600bits
3、DNS query与qurey response过程分析,PDU封装分析(可以只分析query)。
图12:DNS query
DNS query由source 10.225.150.102的port 55523发向destination 172.17.202.7的port 53,在应用层包含以下信息:
头部固定12bytes
Questions包含:(一共21bytes)
Name域名:15bytes
Label count三级域名:2bytes
Type类型A :2bytes
Class类别 in internet :2bytes
总长:12+15+2+2+2=33bytes
图13:DNS qurey response
DNS qurey response由source 172.17.202.7的port 53发向destination 10.225.150.102的port 55523,在应用层包含以下信息:
头部固定12bytes
Questions包含:(一共21bytes)
Name域名:15bytes
Label count三级域名:2bytes
Type类型A :2bytes
Class类别 in internet :2bytes
Answers包含:(一共277bytes)
第一条记录,域名为szmmsns.qpic.cn;Type为CNAME,即别名所对应的规范名称;Class(类型)为IN,即Internet;cname为cmmsns.qpic.cn。此条记录的含义是别名szmmsns.qpic.cn所对应的规范名称是cmmsns.qpic.cn。(21字节)
第二条记录,域名为cmmsns.qpic.cn;Type(查询类型)为A,即由域名获得IPv4地址;Class(类型)为IN,即Internet;address的值为183.60.131.211。此条记录的含义是cmmsns.qpic.cn所对应的IP地址为183.60.131.211。(16字节)
第3到17条记录,每一条都给出cmmsns.qpic.cn所对应的一个IP地址,即cmmsns.qpic.cn共对应15个IP地址。因为szmmsns.qpic.cn是cmmsns.qpic.cn的别名,所以szmmsns.qpic.cn也对应15个IP地址。(16*15=240bytes)
总长:12+21+277=310bytes
4、HTTP过程分析,HTTP request与response PDU封装分析。
所有基于TCP传输的协议都会进行三次握手以确保面向连接的可靠性。
图14:TCP三次握手
图15:HTTP request
验证HTTP request请求消息报文封装:
1.HTTP请求方法,有GET、POST、HEAD等,图15所示的是POST请求方法。
2.Connection 表示是否持久连接,其中close表示非持久,Keep-Alive表示为持久连接,要注意HTTP的持久连接Keep-Alive与TCP的长连接keepalive是有区别的。图15所示的是close表示非持久连接。
3.User-Agent包含了客户端的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎等,图15所示的是浏览器类型。
图16:HTTP response
验证http response 响应请求报文封装:
1.状态行:HTTP/1.1 200 OK。HTTP 200 表示http请求成功。即正常的成功访问时响应的状态码。
2.Connection 表示是否持久连接,图16所示的是close表示非持久连接。
3.Content-Length是响应头部长度:1959。
5、SMTP过程及PDU封装分析(POP可不进行分析)
图17:新建邮件类型为pop的邮箱
由于早期的邮件系统不加密,所以可以捕抓到邮件内容。 TCP流可以看到有SMTP的邮件内容。
图18:三次握手
图19:SMTP报文
通过图19可以看到SMTP过程,可以看到我通过新建的邮箱发出去的邮件,可以看到发送方和接收方的邮箱,同时通过250 OK表示服务器成功执行了客户端的命令,发生250应答,通知看不到可以发生下一个命令。
图20:POP报文
通过图19可以看到POP过程,可以看到USER是建立连接后第一个一个执行的命令,用来告诉服务器用户名,图中的用户名是xxx@qq.com是我的QQ邮箱。
PASS是紧跟在USER后面,用来告诉服务器用户的口令。LIST是告诉我我们邮件的基本信息,当不带参数时服务器会给出邮件的个数和每个邮件的大小。RETR是从服务器上获取邮件。
6、FTP过程分析,PDU封装分析
通过FTP Server让用户能连接上一个远程计算机,但是先要获取远程计算机的IPv4地址(win+r打开运行窗口,通过在命令行中输入ipconfig即可查看电脑IPv4地址),接着在本机通过指令FTP 对应的IPv4地址即可连接FTP。
图21:同学的电脑的IPv4地址
图22:连接FTP
图23:FTP报文
7、针对User-Agent的网站编程
User-Agent包含客户端操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎等。
JSP获得user-agent:request.getHeader(“user-agent”);获得客户端IP地址:request.getRemoteAddr();获得连接端口:request.getRemotePort();可使用正则表达式判断设备:
String iosReg = “ip(hone|od|ad)”; Pattern iosPat = Pattern.compile(iosReg, Pattern.CASE_INSENSITIVE);
Matcher matcherIOS = iosPat.matcher(User-Agent);if (matcherIOS.find()) {return true; }
ASP.NET获得user-agent: Request.ServerVariables[“HTTP_USER_AGENT”];获得客户端IP地址: Request.ServerVariables[“REMOTE_ADDR”];使用正则表达式判断设备:
Regex apple = new Regex(“ipod|iphone|ipad”); Match isApple = apple.Match(user-agent);
if (isApple.Success){deviceType = “Apple”;}
ASP.NET也可使用GitHub的Nuget包----ToolBox.UserAgentParse。
此外也可以使用JavaScript专业的 User-Agent 解析工具库UAParser.js进行解析
编写简单页面,通过局域网访问测试
代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>针对User-Agent的网站编程</title> </head> <body> <br>ZShiJ<br> <br>user-agent:<%=request.getHeader("user-agent")%> <br>客户端IP地址:<%=request.getRemoteAddr()%> <br>获得连接端口:<%=request.getRemotePort()%> <br>客户提交信息的方式:<%=request.getMethod()%> <br>使用的协议:<%=request.getProtocol()%> <br>返回除去host(域名或者ip)部分的路径:<%=request.getRequestURI()%> <br>返回全路径:<%=request.getRequestURL()%> <br>服务器端:<%=request.getServerPort()%> <br>服务器的名称:<%=request.getServerName()%> </body> </html>
图24:根据客户端访问请求获取信息
通过编写JSP获得user-agent,客户端IP地址,连接端口,客户提交信息的方式,使用的协议,服务器端以及服务器的名字。