各种包的分析总结
- TCP包的分析,包括使用wireshark进行抓包的分析
第一行:2个字节表示源端口,2个字节表示目的端口(0-65535)
第二行:序列号,保证数据的顺序
第三行:确认序号:确保自己已经收到了
第四行:首部长度(数据偏移):占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远.“数据偏移”的单位是 32 位字(以 4 字节为 计算单位)
保留:占6位,目前置为0
URG:URG=1,则代表后面的紧急指针有效,此数据应尽快传送
ACK:ACK=1,则代表确认序号有效
PSH:PSH=1,的报文段,就尽快地交付接收应用进程,而不再等到整个缓 存都填满了后再向上交付
RST:RST=1,释放当前链接,重新建立TCP链接
SYN:SYN=1,代表链接请求,或链接接收报文
FIN:FIN=1,释放链接的请求
窗口:决定接收方可以接收多少个包,包的数量(2个字节)
第五行:校验和:检验和字段检验的范围包括首部和数据这两部分.在计算检验 和时,要在 TCP 报文段的前面加上 12 字节的伪首部
紧急指针:占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急 数据放在本报文段数据的最前面)
第六行:选项:长度可变.TCP 最初只规定了一种选项,即最大报文段长度 MSS.MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长 度是 MSS 个字节.” [MSS(Maximum Segment Size)是 TCP 报文段中的数据 字段的最大长度.数据字段加上 TCP 首部才等于整个的 TCP 报文段]
填充:这是为了使整个首部长度是 4 字节的整数倍
|
|
使用wireshark抓包抓到的TCP协议的前三行 |
TCP包的flags的数据的值 |
|
|
校验和、紧急指针、选项、填充 |
- UDP包的分析
第一行:源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报 的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为 发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会 把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。 这样,接收端的应用程序就不能发送响应了。
目的端口:接收端计算机上 UDP 软件使用的端口,占据 16 位。
第二行:长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏
|
|
抓取到的UDP包 |
- ARP包的分析
ARP 报文总长度为 28 字节,MAC 地址长度为 6 字节,IP 地址长度为 4 字节。
第一行:硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为 1。
协议类型:表示要映射的协议地址类型。它的值为 0x0800,表示 IP 地 址。
第二行:硬件地址长度和协议长度:分别指出硬件地址和协议的长度,以字节为 单位。对于以太网上 IP 地址的ARP请求或应答来说,它们的值分别为 6 和 4。
操作类型:用来表示这个报文的类型,ARP 请求为 1,ARP 响应为 2, RARP 请求为 3,RARP 响应为 4。
第三行:发送方 MAC 地址:发送方设备的硬件地址(6个字节)
第四行:发送方MAC地址和发送方IP地址(4个字节)
第五行:发送方IP地址和目标MAC地址(6个字节)
第六行:目标MAC地址(6个字节)
第七行:目标IP地址(4个字节)
|
|
抓取到的arp包的类型 |
- IP包的分析
第一层:版本(4):0100(ipv4)、0110(ipv6)
首部长度(4):0000~1111(0~15 x4字节 = 0~60字节),IP包头的长度
优先级与服务类型(8):前4个bit代表优先级,中间3个bit代表服 务类型,最后1个bit未启用(保留,运营商可能会用到)优先级最高 为5,用于语音流量
优先级应用:大公司的专线,
服务类型:低延迟、多通道
总长度(16): 3层+4层+5层(未分片时的长度,不是IP数据包长度)
第二层:标识符(16):相当于id,是发送方随机生成的,同一数据包的分片id 相同,不同数据包的分片标识符不同
标志(3):第1个bit保留;第2个bit若为0代表数据包进行了分片, 为1未分片;第3bit代表是非为最后一个分片(0是,1不是)
段偏移量(13):0,1480,2960,···1480*n,决定ip分片的先后顺序
泪滴攻击TearDrop:构造一个段偏移量不为1480*n的分片,让受害者 重组数据包失败,然后一直重组直到死机,也是ddos攻击的一种。
防御方法:防火墙拦截—>请运营做清洗流量
防火墙可以不然分片的IP包头通过,让应用层去分片,现在防火墙基本都开启可这种防御,只有标志010才能通过;
第三层:TTL(8):Time To Live 0~255单位不是秒,是跳。经过一个路由器-1, 默认255,主要用于防环。
协议号(8):为上层提供服务TCP:6、UDP:17、ICMP:1、IGMP:88还有 很多(网关选择协议,被路由器的hsrp技术替代了,vrrp)
首部校验和(16):校验IP包头部
第四层:源IP地址
第五层:目标IP地址
第六层:可选项
|
|
抓取到的IP包的分析 |
后三行数据分析 |
- HTTP包的分析
HTTP请求报文格式:
请求行:由3部分组成,分别为:请求方法、URL(见备注1)以及协议版本,之间由空格分隔,请求方法包括GET、POST等。协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1。
请求头部包含很多客户端环境以及请求正文的有用信息。请求头部由“关键字:值”对组成,每行一堆,关键字和值之间使用英文“:”分隔。
Accept: 浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Content-Length:表示请求消息正文的长度。
Host: 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。
Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Connection:处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Range:Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
空行,这一行非常重要,必不可少。表示请求头部结束,下面就是请求正文。
请求正文:可选部分,比如GET请求就没有请求正文;POST比如以提交表单数据方式为请求正文。
HTTP响应报文格式:
1.响应行
响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK
其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
//常见状态码:
100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
200~299:表示成功接收请求并已完成整个处理过程。常用200
300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)
400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)
500~599:服务器端出现错误,常用500
更详细的状态码信息
2.响应头
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
设置HTTP响应头往往和状态码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。应答头可以用来完成:设置Cookie,指定修改日期,指示浏览器按照指定的间隔刷新页面,声明文档的长度以便利用持久HTTP连接,……等等许多其他任务。
常见的响应头字段含义:
Allow:服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE4、IE5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept- Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content- Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置 Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。
Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
Refresh:告诉浏览器隔多久刷新一次,以秒计。
Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie:设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。
Transfer-Encoding:告诉浏览器数据的传送格式。
WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\”executives\”“)。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问。
注:设置应答头最常用的方法是HttpServletResponse的setHeader,该方法有两个参数,分别表示应答头的名字和值。和设置状态代码相似,设置应答头应该在发送任何文档内容之前进行。
setDateHeader方法和setIntHeadr方法专门用来设置包含日期和整数值的应答头,前者避免了把Java时间转换为GMT时间字符串的麻烦,后者则避免了把整数转换为字符串的麻烦。
HttpServletResponse还提供了许多设置
setContentType:设置Content-Type头。大多数Servlet都要用到这个方法。
setContentLength:设置Content-Length头。对于支持持久HTTP连接的浏览器来说,这个函数是很有用的。
addCookie:设置一个Cookie(Servlet API中没有setCookie方法,因为应答往往包含多个Set-Cookie头)。
3.响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类
|
|
抓取HTTP请求包 |
请求包的数据 |
|
|
HTTP响应数据包 |
响应体 |
- 帧的分析
帧头的大小为:14个字节
MTU大小为:1500个字节(中国地区)
帧尾大小为:4个字节
一个帧的大小位:1518个字节
1字节=8位
帧头内的内容包括:目标MAC,源MAC,类型
类型的作用:识别上层协议(IP或ARP)
0x0800:上层为IP协议
0x0806:上层为ARP协议
0x代表16进制
- DNS包的分析
Length:占用两个字节,表示整个DNS数据的长度(不包含length占用的两个字节),这个标志只在TCP请求数据包中存在
Transaction ID:占用两个字节,请求的ID号,应答数据包中的ID号会与请求中的ID号一一对应,理论上此ID号应该是随机的,但是在测试中发现win中使用nslookup查询时此ID号是递增1的,属于特殊情况
Flags:占用两个字节,表示多个标志
Q/R:第一位表示请求(1)/应答(0);
Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
Truncated:表示应答包是否有被截断。请求中会带有一个UDP payload size字段,当应答数据包中DNS数据长度超过该值时,应答则会被截断;只有UDP应答会被截断,TCP请求中,UDP payload size不生效;当客户端收到被截断的数据包时,应转而发送一个TCP-DNS的数据包来获取完整的应答
Recursion desired:为1时表示期望递归查询,为0时表示可以接受迭代查询
Z:保留字段,一般置为0
AD bit:当服务器返回的资源记录已被的本地DNS服务器认证通过时,会将此位置为1,否则置为0
reply-code:应答响应码,表示查询结果
Questions、Answer RRss、Authority RRs、Additonal RRs:标志域名数与资源记录数;一般会根据这里提取到的数值去获取后面的RRs;当数值比实际RRs数要大时,就会解析失败,而当数值比实际的RRs数小时则可能可以解析成功,多出来的RRs数会被放置到下一个区域中去解析(e.g.,answer区域中多出来的RRs数会被放置到authority区域中),末尾多出来的则会被忽略。
先从含义上看,请求中携带的是请求域名、请求记录类型、还有记录类;服务器会跟着请求记录类型来判断需要返回哪种记录类型的数据;记录类(class)表示网络类型,目前只有互联网,所以都是IN。
type和class都是固定占用了两个字节,而域名占用的则有不同;首先域名被分成了3段,即图中的Label Count;域名总长度为13字节(Name Length)。但是在数据包中实际上是占用了15个字节,因为在解析DNS数据包时,会按段提取解析并在每段前面加上每段的长度值,例如第一段是www,长度是3,w对应的ascall码值为77,则会用03 77 77 77来表示www;最终域名的结尾还会加上00来表示文章来源:https://www.toymoban.com/news/detail-758391.html
在应答区域中出现了请求的域名名称,因为不是第一次出现,所以用了c0 0c表示;在DNS数据包中,c0 0c会是比较常见的,因为请求区域中的域名都是在第12个字节中出现。(ID:2字节+flags:2字节+ Questions:2字节+Answer RRss:2字节+Authority RRs:2字节+Additonal RRs:2字节 = 12)。文章来源地址https://www.toymoban.com/news/detail-758391.html
到了这里,关于TCP/UDP/ARP/DNS/HTTP/帧的包头解析(保姆级分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!