TCP/IP及抓包工具的使用(二)

2. TCP/IP协议

1. 什么是OSI参考模型

​ open system interconnect 开放式系统互联 是ISO(国际标准化组织)组织在1985年研究的网络互联模型 该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),即ISO开放系统互连参考模型。

1. osi7层模型和tcp/ip(4层、5层)对照

应用层 OSI中的最高层。为特定类型的网络应用提供了访问OSI环境的手段。应用层确定进程之间通信的性质,以满足用户的需要。如在此常见的协议有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等

表示层 表示层处理流经结点的数据编码的表示方式问题,以保证一个系统应用层发出的信息可被另一系统的应用层读出 ,数据压缩和加密也是表示层可提供的转换功能之一

会话层 会话层主要功能是管理和协调不同主机上各种进程之间的通信(对话),即负责建立、管理和终止应用程序之间的会话

传输层 传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务

网络层 网络层是为传输层提供服务的,本层通过寻址来建立两个节点之间的连接 ,进行路由选择

数据链路层 为网络层提供服务 为网络层提供一个数据链路的连接

物理层 物理层的主要功能是利用物理传输介质为数据链路层提供物理连接(如双绞线 光纤 无线介质等) 数据:比特流 比特最小数据传输单位

2. 什么是tcp/ip参考模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传计算机网络体系结构图

TCP/IP是一组用于实现网络互连的通信协议。Internet网络体系结构以TCP/IP为核心。基于TCP/IP的参考模型将协议分成四个层次,它们分别是:数据链路层(物理层). 网络层、传输层、和应用层

TCP-IP

1.应用层(数据:协议数据单元)

应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等.

2.传输层 ( 数据:数据段)

​ 传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).

​ TCP协议提供的是一种可靠的、面向连接的数据传输服务;而UDP协议提供的则是不可靠的、无连接的数据传输服务.

3.网络层 (数据:数据包)

​ 网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有四个主要协议:网际协议(IP)、地址解析协议(ARP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。

IP协议是网际互联层最重要的协议,它提供的是一个不可靠、无连接的数据报传递服务。

4.数据链路层 (数据:数据帧) 物理层(数据:比特流)

​ 网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。

3. OSI参考模型和TCP/IP参考模型的比较

TCP-IP协议与OSI模型的对应关系(五层分法)

共同点

(1)OSI参考模型和TCP/IP参考模型都采用了层次结构的概念,

(2)都能够提供面向连接和无连接两种通信服务机制;

不同点

(1)前者是七层模型,后者是四层结构

(2)对可靠性要求不同(后者更高)

 (3) OSI模型是在协议开发前设计的, 具有通用性.TCP/IP是先有协议集然后建立模型, 不适用于非TCP/IP网络.

(4)实际市场应用不同(OSI模型只是理论上的模型,并没有成熟的产品,而TCP/IP已经成为“实际上的国际标准”)

总结一下

TCP / IP=


应用层: 它只负责产生相应格式的数据 ssh ftp nfs cifs dns http smtp pop3

-----------------------------------

传输层: 定义数据传输的两种模式:

TCP(传输控制协议:面向连接,可靠的,效率相对不高)

UDP(用户数据报协议:非面向连接,不可靠的,但效率高)

-----------------------------------

网络层: 连接不同的网络如以太网、令牌环网

IP (路由,分片) 、ICMP、 IGMP

-----------------------------------

数据链路层:以太网传输

ARP ( 地址解析协议,作用是将IP解析成MAC )

-----------------------------------

物理层: 主要任务是规定各种传输介质和接口与传输信号相关的一些特性

-----------------------------------

img

4. 抓包命令的使用

抓包工具tcpdump的使用帮助我们更好的去学习协议 wireshark-gnome tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息

tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]

[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]

[ -T 类型 ] [ -w 文件名 ] [表达式 ]

-a    将网络地址和广播地址转变成名字;

-d    将匹配信息包的代码以人们能够理解的汇编格式给出;

-dd    将匹配信息包的代码以c语言程序段的格式给出;

-ddd   将匹配信息包的代码以十进制的形式给出;

-e    在输出行打印出数据链路层的头部信息包括源mac和目的mac,以及网络层的协议;

-f    将外部的Internet地址以数字的形式打印出来;

-l    使标准输出变为缓冲行形式;

-n    不把网络地址转换成名字;

-nn     不把ip和port转换成名字

-t    在输出的每一行不打印时间戳;

-v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;

-vv   输出详细的报文信息;

-c    在收到指定的包的数目后,tcpdump就会停止;

-F    从指定的文件中读取表达式,忽略其它的表达式;

-i    指定监听的网络接口;

-r    从指定的文件中读取包(这些包一般通过-w选项产生);

-w    直接将包写入文件中,并不分析和打印出来;

-T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)

-S:    指定打印每个监听到的数据包的TCP绝对序列号而非相对序列号

1. 三种类型

除了这三种类型的关键字之外,其他重要的关键字如下:

gateway, broadcast,less,greater

三种逻辑运算,取非运算是 ‘not ’ ‘! ‘, 与运算是’and’,’&&’;或运算 是’or’ ,’||’;

1. 第一种类型关键字

包括 host ,net,port 定义捕获数据包的范围

1.截获192.168.116.100 主机通信所有数据包

tcpdump host 192.168.116.100

2.截获192.168.116.0/24该网络内数据包

tcpdump net 192.168.116.0/24

3.截获主机192.168.116.100 和 192.168.116.1 或者和 192.168.116.150通信的数据包 注意’()’ 转译括号

tcpdump -nn host 192.168.116.100 and '(192.168.116.1 or 192.168.116.150)'

4.截获主机192.168.116.100和 除了192.168.116.1通信的说有数据

tcpdump -nn host 192.168.116.100 and ! 192.168.116.1

5.截获192.168.116.100主机80端口收到和发出的所有数据包

tcpdump host 192.168.116.100 and port 80
2. 第二种是确定传输方向的关键字

主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向 默认是src和dst

1.截获源ip为192.168.116.100 并且 目标ip为192.168.116. 150的数据包

tcpdump -nn src 192.168.116.100 and dst 192.168.116.150

2.截获源ip为192.168.116.100 源端口 80 并且 目标ip为192.168.116. 150 目标端口 22 的数据包

tcpdump -nn src 192.168.116.100 and src port 80 and dst 192.168.116.1 and dst port 22
3. 第三种是协议的关键字

​ 主要包括fddi,ip,arp,rarp,tcp,udp,icmp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包

1.截获主机192.168.116.100 端口22 并且是tcp协议的数据包

tcpdump -nn host 192.168.116.100 and port 22 and tcp

2.抓取网口eth0上192.168.116.250与除192.168.116.74外的其他主机之间的icmp报文

tcpdump -i eth0 -s 1400 -nn host 192.168.116.250 and ! 192.168.116.74 and icmp -e

Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料

2. 练习

1.抓取客户端对你服务端80 端口 和 21端口的数据

tcpdump -i ens33 -nn port 80 and port 21

2.只抓取目标是服务端80端口的数据

tcpdump -i ens33 -nn port 80

3.抓取icmp协议的数据

tcpdump -i ens37 icmp

5.各层简述与协议的概述

1. 数据链路层

数据链路层

1. ARP协议

ARP工作原理

ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。

ARP地址解析协议用于将计算机的网络地址(IP地址32位)转化为物理地址(MAC地址48位)[RFC826]。ARP协议是属于数据链路层的协议,在以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址(硬件地址)来确定接口的,而不是根据32位的IP地址。内核(如驱动)必须知道目的端的硬件地址才能发送数据

1、应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);

2、内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表

3、如果存在该IP-MAC对应关系,那么跳到步骤7;如果不存在该IP-MAC对应关系,那么接续下面的步骤;

4、内核进行ARP广播,目的地的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;

5、当192.168.1.2主机接收到该ARP请求后,将源主机的IP地址及MAC更新至自己的arp缓冲中,然后发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;

6、本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;

7、内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;

使用arp-a命令就可以查看本地的ARP缓存内容,所以,执行一个本地的PING命令后,ARP缓存就会存在一个目的IP的记录了。当然,如果你的数据包是发送到不同网段的目的地,那么就一定存在一条网关的IP-MAC地址对应的记录。

img

以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全F的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧

两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806

hardware (硬件)和protocol (协议)用来描述ARP分组中的各个字段。例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)

  • 硬件类型字段表示硬件地址的类型。它的值为1即表示以太网地址。
  • 协议类型字段表示要映射的协议地址类型。它的值为0x0800即表示IP地址
  • 硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。 各占用1字节
  • op操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和R ARP应答(值为4)。
  • 接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、
  • 目的端的硬件地址和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。

对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。

2. RARP即反向地址转换协议

​ 反向地址转换协议(RARP:Reverse Address Resolution Protocol) 反向地址转换协议(RARP)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用

tcpdump抓取arp包

[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.18

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
16:18:59.533494 arp who-has 192.168.0.18 tell 192.168.0.40 //ARP的请求
16:18:59.533874 arp reply 192.168.0.18 is-at 00:0c:29:05:dc:4b (oui Unknown) 

//ARP的回应
[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.2 -w /var/ftp/arp.tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2 packets captured
215 packets received by filter
112 packets dropped by kernel


[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.2 -c 5 -w /var/ftp/arp.tcpdump
[root@station040 ~]# tcpdump -i eth0 arp and host 192.168.0.2 -r /var/ftp/arp.tcpdump // 从文件中读取
reading from file /var/ftp/pg/arp.tcpdump, link-type EN10MB (Ethernet)
16:21:48.307307 arp who-has 192.168.0.2 tell 192.168.0.40
16:21:48.307630 arp reply 192.168.0.2 is-at 00:0c:29:9e:99:ef (oui Unknown
//tcpdump默认只抓取包的前96 bytes,-s 1500可抓到整个包的数据

查看缓存表
[root@station040 ~]# arp -n

注意:

# 如果出现两个MAC,可能目标主机是双网卡,也可能是IP冲突

# 如果不能正常通信的话(ping不通),那就是IP冲突,否则双网卡
3. 回答问题

1.IP冲突的本质是什么?

​ 我们知道,如果网络中存在相同IP地址的主机的时候,就会报告出IP地址冲突的警告。这是怎么产生的呢?

​ 比如某主机B规定IP地址为192.168.0.1,如果它处于开机状态,那么其他机器A更改IP地址为192.168.0.1就会造成IP地址冲突。其原理就是:主机A在连接网络(或更改IP地址)的时候就会向网络发送ARP包广播自己的IP地址,也就是freearp。如果网络中存在相同IP地址的主机B,那么B就会通过ARP来reply该地址,当A接收到这个reply后,A就会跳出IP地址冲突的警告,当然B也会有警告

2.arp欺骗

ARP代理

​ ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。因此,在上面的假设网络中,B向A发送一个自己伪造的ARP应答,而这个应答中的数据为发送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存,将本地的IP-MAC对应表更换为接收到的数据格式,由于这一切都是A的系统内核自动完成的,A可不知道被伪造了。

2. 网络层

网络层

1. IP协议

​ IP是英文Internet Protocol(网络之间互连的协议)的缩写,中文简称为“网协”,也就是为计算机网络相互连接进行通信而设计的协议。

1. IP协议简介: 路由、分片

​ IP协议是TCP/IP协议族中最为核心的协议。所有TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。

特点

  • 不可靠(unreliable): 它不能保证IP数据报能成功地到达目的地。IP仅提供尽力而为的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。
  • 无连接(connectionless): 这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明, IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
2. ip数据报分析

ip协议首部 20字节

img

IP数据报格式
IP数据报首部的固定部分中的各字段

(1)版本 占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于IPv6

(2)首部长度 占4位,可表示的最大十进制数值是15(1111)则表示60字节头长度.最常用的首部长度就是20字节(即首部长度为0101)

(3)服务类型 占8位,区分服务 用来获得更好的服务. 高层协议通过服务类型字段告诉ip处理设备,应该如何处理这个数据包,该字段占一个字节长(包括3bit优先级[0~7最高] 第4延迟bit 吞吐量标志第5bit 可靠性标志第6个bit 第7bit最小开销标志)

(4)总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。

(5)标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

(6)标志(flag) 包分片标识 占3位,但目前只有2位有意义。第一位保留

● 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。

● 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

(7)片偏移 占13位 表示当前的这个数据分片在原有数据包中所处的位置,有了这个字段就便于目标主机一片一片的重组数据包

(8)生存时间 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),每记过一个路由器 该值就减1,当TTL值为0时,路由器就会丢弃该数据,并且向发包主机返回一个报警信息.后来把TTL字段的功能改为“跳数限制".TTL的意义是指明数据报在网络中至多可经过多少个路由器。显然,数据报在网络上经过的路由器的最大数值是255.若把TTL的初始值设为1,就表示这个数据报只能在本局域网中传送.这种机制避免了数据包在网络中无线的循环

[root@station040 ~]# cat /proc/sys/net/ipv4/ip_default_ttl

64

(9)协议 占8位,协议字段指出此数据报携带上层的数据是使用何种协议.比如 tcp 该值为6 udp该值17 1表示为ICMP协议, 2表示为IGMP协议

(10)首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。

(11)源地址 占32位。

(12)目的地址 占32位

[root@station040 ~]# tcpdump -i eth0 port 22 and host 192.168.0.149 -w /var/ftp/ip.tcpdump

img

3. IP分片

分片

超过1500 byte,发送端分片,接收端重组

[root@server2 ~]# ip link show eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:21:4d:a6 brd ff:ff:ff:ff:ff:ff

[root@server ~]# tcpdump -i eth0 -nn -s 1500 icmp and host 192.168.116.100 -w fragment.txt

[root@server ~]# ping -c 1 -s 4000 192.168.0.100
PING 192.168.0.100 (192.168.0.100) 4000(4028) bytes of data.
4008 bytes from 192.168.0.100: icmp_seq=1 ttl=128 time=0.463 ms
1500 - 8 - 20 = 1472

1500 - 20 = 1480

1068 - 20 = 1048

1472 + 1480 + 1048 = 4000

只有一个分片有上层协议(ICMP)协议

只要是同一个IP包,分片的Identification值都一样
4. 利用ip碎片攻击

​ IP首部有两个字节表示整个IP数据包的长度,所以IP数据包最长只能为0xFFFF,就是65535字节。如果有意发送总长度超过65535的IP碎片,一些老的系统内核在处理的时候就会出现问题,导致崩溃或者拒绝服务。另外,如果分片之间偏移量经过精心构造,一些系统就无法处理,导致死机。所以说,漏洞的起因是出在重组算法上。下面我们逐个分析一些著名的碎片攻击程序,来了解如何人为制造IP碎片来攻击系统

ping of death

ping of death是利用ICMP协议的一种碎片攻击。攻击者发送一个长度超过65535的echo Request数据包,目标主机在重组分片的时候会造成事先分配的65535字节缓冲区溢出,系统通常会崩溃或挂起。ping不就是发送ICMP Echo Request数据包的吗?让我们尝试攻击一下吧!不管IP和ICMP首部长度了,数据长度反正是多多益善,就65535吧,发送一个包:

# ping -c 1 -s 65535 192.168.0.1

Error: packet size 65535 is too large. Maximum is 65507

不走运,看来Linux自带的ping不允许我们做坏事。

65507是它计算好的:65535-20-8=65507。Win2K下的ping更抠门,数据只允许65500大小。所

以你必须找另外的程序来发包,但是目前新版本的操作系统已经搞定这个缺陷了,还有jolt2 和

teardrop

5. 如何阻止IP碎片攻击
  • Windows系统请打上最新的Service Pack,目前的Linux内核已经不受影响。

  • 如果可能,在网络边界上禁止碎片包通过,或者用iptables限制每秒通过碎片包的数目。

  • 如果防火墙有重组碎片的功能,请确保自身的算法没有问题,否则被DoS就会影响整个网络。

  • Win2K系统中,自定义IP安全策略,设置“碎片检查

2. ICMP协议
1. ICMP协议简介

​ ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

​ ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程

其功能主要有:

· 侦测远端主机是否存在。

· 建立及维护路由资料。

· 重导资料传送路径。

2. 报文格式

ICMP报文格式

3. ICMP首部

img

[root@server2 ~]# ping 192.168.0.100
PING 192.168.0.100 (192.168.0.100) 56(84) bytes of data.
64 bytes from 192.168.0.100: icmp_seq=1 ttl=128 time=0.322 ms
64 bytes from 192.168.0.100: icmp_seq=2 ttl=128 time=0.489 ms
64 bytes from 192.168.0.100: icmp_seq=3 ttl=128 time=0.442 ms

tcpdump -i eth0 icmp and host 192.168.118.100 -w /tmp/icmp.txt

img

1. type 类型 8位

8 响应请求(ECHO-REQUEST)

0 响应应答(ECHO-REPLY)

3 不可到达

type 3

code代码字段(8位) 网络不可到达(Code=0) ping不存在的网段主机 有网关 网关开转发并且没有该网段路由

[root@robin ~]# tcpdump -nn -i ens33 icmp -w /tmp/icmp-3.txt

主机不可到达(Code=1)

1.ping本网段的一台主机,主机不存在(lo响应自己)

[root@robin ~]# tcpdump -nn -i lo icmp -w /tmp/icmp-1.txt

image-20201209112608423

2.ping不在本网段的主机 有网关 网关开转发并且有该网段路由 对应主机不存在

[root@robin ~]# tcpdump -nn -i ens33 icmp -w /tmp/icmp-2.txt

协议不可到达(Code=2)

端口不可到达 (Code=3)

1.ping存在主机 对应主机有防火墙 REJECT

2.指定一个不存在的dns, 解析域名

[root@robin ~]# tcpdump -nn -i ens33 icmp -w /tmp/icmp-4.txt
2. checksum校验和字段(16位)

​ wireshark考虑到window系统与Linux系统发出的ping报文(主要指ping应用字段而非包含IP头的ping包)的字节顺序不一样(windowsLElittle-endian byte orderLinuxBEbig-endian),为了体现wireshark的易用性,开发者将其分别显示出来。

标签1

[root@station040 pg]# tcpdump -i eth0 icmp and host 192.168.0.149 -w /var/ftp/icmp.tcpdump

[root@station10 /]# tcpdump -i eth0 icmp and host 192.168.0.9 -w /icmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10 packets captured //抓到了10个包,因为ping了5个包,每个包往返一次
10 packets received by filter
0 packets dropped by kernel

标签2

[root@station10 ~]# ping 192.168.0.9 -c5 //ping了5个包
PING 192.168.0.9 (192.168.0.9) 56(84) bytes of data.
64 bytes from 192.168.0.9: icmp_seq=1 ttl=64 time=2.00 ms //icmp_seq=1表示ping的第一个包
64 bytes from 192.168.0.9: icmp_seq=2 ttl=64 time=0.210 ms
64 bytes from 192.168.0.9: icmp_seq=3 ttl=64 time=0.297 ms
64 bytes from 192.168.0.9: icmp_seq=4 ttl=64 time=0.210 ms
64 bytes from 192.168.0.9: icmp_seq=5 ttl=64 time=0.293 ms
--- 192.168.0.9 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 0.210/0.603/2.005/0.702 ms
3. 查看抓到的包(Protocal:ICMP)
192.168.0.10 192.168.0.9 ICMP Echo(ping) request
192.168.0.9 192.168.0.10 ICMP Echo(ping) reply

点击第1个包

Frame 1
Ethernet II
Internet Protocol //IP
Internet Control Message Protocol //ICMP

# 注意;icmp是ip的上层,但他俩都属于网络层,这时个特殊情况

打开Internet Control Message Protocol,需要了解的字段

Type: 8(Echo (ping) request) //最常见的两种是echo request(请求)/ echo reply(回复)
Identifier: 0*9715 //标识用于区分不同的ICMP的消息
sequence number: 1 //序列号,发ICMP消息的序号,这里是1,说明是Ping的第一个包,等同于icmp_seq=1

# 注意: 如果同时ping一个机器5个包,序列号都是从1-5,根据序列号无法判断是哪个机器或终端ping的,这时就要根据标识来判断

补充

icmp类型常见的有: echo request 、 echo reply 、 目标主机不达 、 网络不可达 、 udp的port不可达(当访问一台主机的UDP某端口,但其又没有开放此端口时,对方会回应一个icmp的不可达消息(udp port unreachable),以找DNS服务器的UDP的53端口查询域名为例子)

例子

# 前提条件;192.168.0.9根本就不是DNS服务器,也就没有开放对应的端口

[root@station10 ~]# vim /etc/resolv.conf
search domain.org
nameserver 192.168.0.9

标签1
[root@station10 /]# tcpdump -i eth0 host 192.168.0.9 -w /icmp2
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel


标签2
[root@station10 ~]# host www.baidu.com
;; connection timed out; trying next origin
;; connection timed out; no servers could be reached
查看抓到的包(Protocal:DNS,ICMP,ARP)

192.168.0.10 192.168.0.9 DNS Standard query A www.baidu.com
192.168.0.9 192.168.0.10 ICMP Destination unreachable(Port unreachable)



首先查看DNS协议的包:

Frame 1
Ethernet II
Internet Protocol
User Datagram Protocol //可知dns使用的是udp协议
Domain Name System(query)
进入Domain Name System(query)
打开Queries
www.baidu.com: type A, class IN //这个是我们熟悉的格式,IN表示internet类型

再查看ICMP协议的包: //返回的是icmp的包,而不是udp的

Frame 2
Ethernet II
Internet Protocol //IP
Internet Control Message Protocol //ICMP
打开Internet Control Message Protocol,需要了解的字段
Type: 3 (Destination unreachable)
Code: 3 (Port unreachable)

4. ICMP攻击方式

​ ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。例如,在1999年8月海信集团“悬赏”50万元人民币测试防火墙的过程中,其防火墙遭受到的ICMP攻击达334050次之多,占整个攻击总数的90%以上!可见,ICMP的重要性绝不可以忽视!

​ 比如,可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定,向主机发起“Ping of Death”(死亡之Ping)攻击。“Ping of Death” 攻击的原理是:如果ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。(操作系统已经取消了发送ICMP数据包的大小的限制,解决了这个漏洞)

​ 此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理,疲于奔命。

防御方法选择合适的防火墙

​ 有效防止ICMP攻击,防火墙应该具有状态检测、细致的数据包完整性检查和很好的过滤规则控制功能。

​ 状态检测防火墙通过跟踪它的连接状态,动态允许外出数据包的响应信息进入防火墙所保护的网络。例如,状态检测防火墙可以记录一个出去的 PING(ICMP Echo Request),在接下来的一个确定的时间段内,允许目标主机响应的ICMP Echo Reply直接发送给前面发出了PING命令的IP,除此之外的其他ICMP Echo Reply消息都会被防火墙阻止。与此形成对比的是,包过滤类型的防火墙允许所有的ICMP Echo Reply消息进入防火墙所保护的网络了。许多路由器和基于Linux内核2.2或以前版本的防火墙系统,都属于包过滤型,用户应该避免选择这些系统。

​ 新的攻击不断出现,防火墙仅仅能够防止已知攻击是远远不够的。通过对所有数据包进行细致分析,删除非法的数据包,防火墙可以防止已知和未知的 DoS攻击。这就要求防火墙能够进行数据包一致性检查。安全策略需要针对ICMP进行细致的控制。因此防火墙应该允许对ICMP类型、代码和包大小进行过滤,并且能够控制连接时间和ICMP包的生成速率。

3. 传输层

1. UDP协议

UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议.是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。在网络中它与TCP协议一样用于处理 UDP数据包。在OSI模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说当报文发送之后,是无法得知其是否安全完整到达的。

UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的QQ 视频会议软件就是使用的UDP协议。

1. UDP协议首部

img

UDP协议 首部 8 字节

不用先与对方建立连接(非面向连接)

source port: 主动访问端的源端口总是大于1024的随机端口

destination port: 目的端口

length: 指的是当前UDP的数据段的长度(DATA长度+UDP首部的长度)

数据报文的长度=DATA长度+8字节UDP首部的长度+20字节IP首部的长度

syslog和dns默认用UDP,zone数据报传输的时候用TCP

checksum:检查校验和

非面向连接:不用先与对方建立连接,不握手

不可靠的:没有确认机制

1. 需要掌握的字段
source port: //主动访问端的源端口总是大于1024的随机端口

destination port:

length: //指的是当前UDP的数据段的长度(DATA长度+UDP首部的长度)

# 注意:udp用于网络理想时的状态,但网络一般不理想,所以udp一般用于局域网,公网常见的只有dns,

dns两个端口,其中tcp/53 一般在从服务器同步主服务器的时候用udp的可靠性不是靠协议,是靠应用程序,靠程序员
2. 实验
[root@server2 ~]# tcpdump -i eth0 -nn udp and host 192.168.0.101

[root@server2 ~]# nc -l 192.168.0.101 -u 5555 //打开本地udp端口5555

[root@server2 ~]# nc 192.168.0.101 -u 5555 //连接到192.168.0.101的udp 5555端口

ssss

nc: Write error: Connection refused

两边互发报文,wireshark查看详细信息

2. UDP Flood攻击

原理

​ UDP Flood是日渐猖厥的流量型DoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。 100k pps的UDP Flood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDP FLOOD攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。

2. TCP协议

TCP协议即TCP(传输控制协议)

​ Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。TCP在IP报文的协议号是6。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。

1. TCP首部

img

img

Source Port / Destination Port :来源端口/目的端口。其中包含来源端口/目的端口的端口号。

Sequence Number :封包序号。当数据要从一台主机传送去另一台主机的时候,发送端会为封包建立起一个起始序号,然后按照所传送的数据长度(字节数值),依次递增上去。使用递增之后的值来作为下一个封包的序号。这样接收端就可以根据序号来检测资料是否接收完整了。

Acknowledge Number :回应序号。当接收端接收到 TCP 封包并通过检验确认之后,会依照发送序号、再加上数据长度产生一个响应序号,附在下一个响应封包送回给对方(无需额外的送出专门的确认封包),这样接收端就知道刚才的封包已经被成功接收到了。假如基于网络状况或其它原因,当封包的定时器达到期限时,接收端还没接收到回应序号,就会认为该封包丢失了并加以重送。如果刚好重发封包之后才接收到响应,接收端就会根据序号来判断该封包是否被重复发送,如果是的话,将之丢弃不做任何处理

首部长度:tcp包首部的长度

Contral Flag:控制标记。一共有六个它们分别是:

Urgent data

​ 如果URG为1,表示这是一个携有紧急资料的封包。 TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲。通信的时候网络故障问题引起的数据没传完,会发送一个URG标记位

Acknowledgment field significant

如果ACK为1,表示此封包属于一个要回应的封包。一般都会为1。

Push function

如果PSH为1,此封包所携带的数据会直接上传给上层应用程序而无需经过TCP处理。

Reset

如果RST为1,要求重传。表示要求重新设定封包再重新传递。

Synchronize sequence number

如果SYN为1,表示要求双方进行同步沟通。

No more data for sender (Finish)

如果FIN为1,表示传送结束,然後双方发出结束回应进而正式终止一个TCP传送过程

window滑动窗口

​ TCP使用一种窗口(window)机制来控制数据流。当一个连接建立时,连接的每一端分配一个缓冲区来保存输入的数据,并将缓冲区的尺寸发送给另一端。当数据到达时,接收方发送确认,其中包含了自己剩余的缓冲区尺寸。剩余的缓冲区空间的大小被称为窗口( window) ,指出窗口大小的通知称为窗口通告(window advertisement) 。接收方在发送的每一确认中都含有一个窗口通告。

​ 如果接收方应用程序读数据的速度能够与数据到达的速度一样快,接收方将在每一确认中发送一个正的窗口通告。然而,如果发送方操作的速度快于接收方(由于CPU更快) ,接收到的数据最终将充满接收方的缓冲区,导致接收方通告一个零窗口( zero window) 。发送方收到一个零窗口通告时,必须停止发送,直到接收方重新通告一个正的窗口。

​ 比如两台主机A向B主机发包,如果B主机的缓冲区缓冲的数据大小,超出部分就会被B机丢弃,也叫缓冲区溢出,那么这种情况如何解决?这就用到了滑动窗口机制,如果A主机并不确定B主机缓冲区大小,那么先发3个数据包给B主机,B主机缓冲区只有2,那么B主机就会应答给A主机数据包 补发数据3并且告诉A主机win_size2.A主机接收到后可能还会发3,4,5这3个数据给主机B,主机B再次应答补发数据包5并且告诉A主机win_size2,这时候A主机知道了B主机只能接受2个数据包.

TCP滑动窗口

Chechsum

​ 当资料要传送出去的时候发送端会计算好封包资料大小然後得出这个检验值封包一起发送当接收端收到封包之後会再对资料大小进行计算看看是否和检验值一致如果结果不相称则被视为残缺封包会要求对方重发该个封包。

16位紧急指针:只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

2. TCP协议的3次握手

img

TCP三次握手

3. TCP协议的4次挥手

img

序列号、确认号

通信的双方各自维护着一套 seq 序列号,并对对方发送的数据包进行 ACK 确认。

顺序号和确认号

[root@server2 ~]# tcpdump -i eth0 -nn -S -r tcp.tcpdump //-S详细的方式,适合看序列号

[root@server2 ~]# tcpdump -i eth0 -nn -S -r tcp.tcpdump > tcp.file

重传机制(RTT)

每个数据段都有一个重传时间 这个时间是根据网络情况算出来.如果在该时间范围内没有ack 那就要重传数据段注意不是数据包.(数据段可能是N个数据包) 网络层不是管重传的只能在传输层完成

【注】
重传的是数据段,不是数据包

MSS最大报文段长度

​ MSS表示TCP传往另一端最大块数据的长度。当一个连接建立时,连接的双方都要通各自的MSS。一般来说,报文段越大,允许每个报文段传输的数据就越多,相对于IP和TCP首部有更高的网络利用率。

以太网MSS: MTU(1500) - 40(TCP首部) - 20(IP首部) = 1440

4. TCP的特点总结

1.面向连接: 三次握手和四次挥手

SYN 同步标记

FIN 结束标记

2.可靠的: 确认和重传机制

确认机制: ACK 确认标记

重传机制: 在RTT(数据段往返时间),没有收到ACK,则认为需要重传整个数据段序列号,确认号

3、TCP的状态

4、TCP的标记

SYN: 同步标记位

ACK: 确认标记位(包括三次握手中的确认及之后数据传输时的确认)

RST: 重置标记位(访问一个未打开的TCP端口时,服务器返回一个带RST标记位的响应)

PSH: 推标记位 (延时性比较高的时候都会加上PSH,比较快的发送出去,不往缓存中放,ssh,telnet,ftp-command)

URG: 紧急标志位(通信的时候网络故障问题引起的数据没传完,会发送一个URG标记位)

FIN: 结束标记位 ( 发送端完成发送任务,双方都需要确认没有数据再发给对方 )

syn flood

攻击原理:SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,常用假冒的IP或IP号段发来海量的请求连接的第一个握手包(SYN包),被攻击服务器回应第二个握手包(SYN+ACK包),因为对方是假冒IP,对方永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的半连接,并且会重试默认5次回应第二个握手包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来通过防火墙解决

4. 应用层

1. FTP协议
1. FTP协议简介

​ FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写。该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。

2. FTP两种模式

两种数据传输模式:主动模式,被动模式

被动模式:服务器端只开21和大于1024随机端口

服务器和客户端会协商好一个端口,然后客户端从这个端口读数据


主动模式: 服务器端打开21和20端口

客户端和服务端通过21号端口传输数据

lftp -d FTP_SERVER_IP //查看FTP协议命令 debug
【注】
测试的时候服务器端只开启服务,将相关端口打开就不进行任何操作。
客户端需要一台,开启两个终端进行测试
一个终端监听服务器的地址和端口
另外一个终端监听自己的ip地址和自己打开的端口

[root@localhost yum.repos.d]# nc 192.168.43.134 21
220 (vsFTPd 3.0.2)
USER ftp      
331 Please specify the password.
PASS
230 Login successful.
LIST
425 Use PORT or PASV first.
PORT 192,168,43,140,48,57
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
226 Directory send OK.


[root@localhost html]# nc 192.168.43.140 -l 12345
-rw-r--r--    1 0        0               4 Nov 06 03:21 a.txt
drwxr-xrwx    2 0        0               6 Nov 06 03:34 aa
drwxr-xrwx    2 0        0               6 Nov 06 03:42 pub

被动模式测试

[root@localhost yum.repos.d]# nc 192.168.43.134 21
220 (vsFTPd 3.0.2)
user ftp      
331 Please specify the password.
pass
230 Login successful.
PASV
227 Entering Passive Mode (192,168,43,134,109,96).//服务器在该端口上等着客户端
LIST
150 Here comes the directory listing.
226 Directory send OK.

[root@localhost html]# echo $((109*256+96))
28000
[root@localhost html]# nc 192.168.43.134 28000
-rw-r--r--    1 0        0               4 Nov 06 03:21 a.txt
drwxr-xrwx    2 0        0               6 Nov 06 03:34 aa
drwxr-xrwx    2 0        0               6 Nov 06 03:42 pub

主动模式测试: 服务器端只开21和20端口

【注】
测试的时候服务器端只开启服务,将相关端口打开就不进行任何操作。
客户端需要一台,开启两个终端进行测试
一个终端监听服务器的地址和端口
另外一个终端监听自己的ip地址和自己打开的端口

[root@localhost yum.repos.d]# nc 192.168.43.134 21
220 (vsFTPd 3.0.2)
USER ftp      
331 Please specify the password.
PASS
230 Login successful.
LIST
425 Use PORT or PASV first.
PORT 192,168,43,140,48,57
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
226 Directory send OK.


[root@localhost html]# nc 192.168.43.140 -l 12345
-rw-r--r--    1 0        0               4 Nov 06 03:21 a.txt
drwxr-xrwx    2 0        0               6 Nov 06 03:34 aa
drwxr-xrwx    2 0        0               6 Nov 06 03:42 pub

3. FTP客户端命令
[root@station040 ~]# lftp -e 'cd pub; get downfile; quit' 192.168.2.51

[root@station040 ~]# wget ftp://192.168.2.51/pub/downfile -O /tmp/myfile

[root@station040 ~]# wget http://192.168.2.251/downfile1

抓取ftp用户登录密码

抓取telnet登录密码

1. FTP命令
命令 描述

ABOR 中断数据连接程序

ACCT <account> 系统特权帐号

ALLO <bytes> 为服务器上的文件存储器分配字节

APPE <filename> 添加文件到服务器同名文件

CDUP <dir path> 改变服务器上的父目录

CWD <dir path> 改变服务器上的工作目录

DELE <filename> 删除服务器上的指定文件

HELP <command> 返回指定命令信息

LIST <name> 如果是文件名列出文件信息,如果是目录则列出文件列表

MODE <mode> 传输模式(S=流模式,B=块模式,C=压缩模式)

MKD <directory> 在服务器上建立指定目录

NLST <directory> 列出指定目录内容

NOOP 无动作,除了来自服务器上的承认

PASS <password> 系统登录密码

PASV 请求服务器等待数据连接 //被动

PORT <address> IP 地址和两字节的端口 ID //主动

PWD 显示当前工作目录

QUIT 从 FTP 服务器上退出登录

REIN 重新初始化登录状态连接

REST <offset> 由特定偏移量重启文件传递

RETR <filename> 从服务器上找回(复制)文件

RMD <directory> 在服务器上删除指定目录

RNFR <old path> 对旧路径重命名

RNTO <new path> 对新路径重命名

SITE <params> 由服务器提供的站点特殊参数

SMNT <pathname> 挂载指定文件结构

STAT <directory> 在当前程序或目录上返回信息

STOR <filename> 储存(复制)文件到服务器上

STOU <filename> 储存文件到服务器名称上

STRU <type> 数据结构(F=文件,R=记录,P=页面)

SYST 返回服务器使用的操作系统

TYPE <data type> 数据类型(A=ASCII,E=EBCDIC,I=binary)

USER <username>> 系统登录的用户名
2. FTP响应码
响应代码 解释说明

110 新文件指示器上的重启标记

120 服务器准备就绪的时间(分钟数)

125 打开数据连接,开始传输

150 打开连接

200 成功

202 命令没有执行

211 系统状态回复

212 目录状态回复

213 文件状态回复

214 帮助信息回复

215 系统类型回复

220 服务就绪

221 退出网络

225 打开数据连接

226 结束数据连接

227 进入被动模式(IP 地址、ID 端口)

230 登录因特网

250 文件行为完成

257 路径名建立

331 要求密码

332 要求帐号

350 文件行为暂停

421 服务关闭

425 无法打开数据连接

426 结束连接

450 文件不可用

451 遇到本地错误

452 磁盘空间不足

500 无效命令

501 错误参数

502 命令没有执行

503 错误指令序列

504 无效命令参数

530 未登录网络

532 存储文件需要帐号

550 文件不可用

551 不知道的页类型

552 超过存储分配

553 文件名不允许
2. http协议
1. HTTP协议简介

​ 超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

使用浏览器访问web服务器

[root@station99 ~]# tcpdump -i eth0 -nn port 80 -s 1500 -w http2.tcpdump //客户端抓取包

[root@station99 ~]# firefox 192.168.0.51


wireshark详细查看:

HTTP GET / HTTP/1.1 -----> Follow TCP Stream (右键)

红色部分: 客户端发给服务器

蓝色部分: 服务器回给客户端

img

使用协议命令访问web服务器

[root@station99 ~]# nc 192.168.0.51 80

GET / HTTP/1.1 //请求站点根目录 【HTTP协议名称及版本可选】
HOST: 192.168.0.99 //发起请求的服务端主机 【可选】
User-Agent: elinks-1.1 //发起请求的客户端代理程序 【可选】
可以忽略其它协商
回车


[root@station99 ~]# nc 192.168.0.51 80
HEAD / HTTP/1.1 //只看HTTP头部内容
HOST: 192.168.0.99

回车


1. HTTP响应头
HTTP/1.1 200 OK //协议返回码200

Date: Thu, 25 Oct 2012 06:16:50 GMT
Server: Apache/2.2.3 (Red Hat) //服务器软件及版本
Last-Modified: Thu, 25 Oct 2012 05:40:00 GMT //告诉客户端是否需要从服务器更新,由于客户端有缓存的数据(提高效率)
ETag: "330001-12-a2518c00" //和服务器比Etag值,作用为Last-Modified相似
Accept-Ranges: bytes
Content-Length: 18
Connection: close
Content-Type: text/html; charset=UTF-8 //和后面讲到的mime类型相关



# 浏览器:

1. 帮客户向服务器发协议命令
2. 解析收到的HTML


如果没有浏览器 回车捕获以下两个网站HTTP头部信息

[root@server2 ~]# nc www.126.com 80
HEAD / HTTP/1.1
Host: 1.1.1.1
HTTP/1.0 403 Forbidden
Server: Cdn Cache Server V2.0
Date: Tue, 11 Jun 2013 02:45:15 GMT
Content-Type: text/html
Content-Length: 685
Expires: Tue, 11 Jun 2013 02:45:15 GMT
X-Via: 1.0 hdwt9:9080 (Cdn Cache Server V2.0)
Connection: close


[root@server2 ~]# nc www.sina.com 80
HEAD / HTTP/1.1
Host: 1.1.1.1
HTTP/1.1 403 Forbidden
Server: squid/2.7.STABLE5
Date: Tue, 11 Jun 2013 02:46:31 GMT
Content-Type: text/html
Content-Length: 116
X-Squid-Error: ERR_ACCESS_DENIED 0
X-Cache: MISS from xd33-70.sina.com.cn
Connection: close
2. MIME类型
[root@server2 ~]# grep mime /etc/httpd/conf/httpd.conf

LoadModule mime_magic_module modules/mod_mime_magic.so

LoadModule mime_module modules/mod_mime.so

# TypesConfig describes where the mime.types file (or equivalent) is TypesConfig /etc/mime.types

# The mod_mime_magic module allows the server to use various hints from the

<IfModule mod_mime_magic.c>

# MIMEMagicFile /usr/share/magic.mime

# file mime.types for specific file types.


# HTTP的持久性连接

关闭KeepAlive off,获得HTTP HEAD信息:


请求头:

GET / HTTP/1.1

Host: 192.168.0.101

User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.18) Gecko/2010020406 Red Hat/3.0.18-1.el5_4 Firefox/3.0.18

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive


响应头


HTTP/1.1 200 OK
Date: Fri, 01 Mar 2013 20:57:23 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Fri, 01 Mar 2013 19:18:07 GMT
ETag: "2e8108-8-4d6e1ddfa59c0"
Accept-Ranges: bytes
Content-Length: 8
Connection: close
Content-Type: text/html; charset=UTF-8
tianyun


开启KeepAlive on,获得HTTP HEAD信息:



请求头:
GET / HTTP/1.1
Host: 192.168.0.101
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.18) Gecko/2010020406 Red Hat/3.0.18-1.el5_4 Firefox/3.0.18

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive



响应头

HTTP/1.1 200 OK
Date: Fri, 01 Mar 2013 20:59:00 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Fri, 01 Mar 2013 19:18:07 GMT
ETag: "2e8108-8-4d6e1ddfa59c0"
Accept-Ranges: bytes
Content-Length: 8
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
tianyun

3. nc命令补充
功能1:连接某主机的某TCP/UDP的端口

功能2:扫描某主机开启了哪些端口

功能3:在本机某TCP/UDP的端口上监听

[root@server2 ~]# nc 192.168.0.99 80 //连接到主机192.168.0.99的TCP端口80,等价于telnet 192.168.0.99 80

[root@server2 ~]# nc 192.168.0.99 -u 5555 //连接到主机192.168.0.99的udp端口5555

[root@server2 ~]# nc 192.168.0.99 -z 1-2000 //扫描主机192.168.0.99开放的TCP端口

[root@server2 ~]# nc 192.168.0.99 -z -u 1-2000 //扫描主机192.168.0.99开放的UDP端口

[root@server2 ~]# nc 192.168.0.99 -l 2000 //在本地接口192.168.0.99的TCP端口2000上监听

[root@server2 ~]# nc 192.168.0.99 -l -u 2000 //在本地接口192.168.0.99的UDP端口2000上监听

[root@server2 ~]# nc 192.168.0.101 -l -u 2000

[root@server2 ~]# netstat -tunlp |grep :2000

udp 0 0 192.168.0.101:2000 0.0.0.0:* 6339/nc
4. HTTP头部解释(扩展)
1. Accept: 告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。

2. Accept-Charset: 浏览器申明自己接收的字符集Accept-Encoding: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)Accept-Language:浏览器申明自己接收的语言,语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。

3. Accept-Ranges: WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。

4. Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

5. Authorization: 当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。

6. Cache-Control: 请求:no-cache(不要缓存的实体,要求现在从WEB服务器去取)
max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象)
max-stale:(可以接受过去的对象,但是过期时间必须小于max-stale 值)
min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
响应:public(可以用 Cached 内容回应任何用户)
private(只能用缓存内容回应先前请求该内容的那个用户)
no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端)
max-age:(本响应包含的对象的过期时间)
ALL: no-store(不允许缓存)

7. Connection: 请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
响应:close(连接已经关闭)。
keepalive(连接保持着,在等待本次连接的后续请求)。
Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。

例如:Keep-Alive:300

8. Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip

Content-Language:WEB 服务器告诉浏览器自己响应的对象的语言。
Content-Length: WEB 服务器告诉浏览器自己响应的对象的长度。例如:Content-Length: 26012
Content-Range: WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range: bytes 21010-47021/47022
Content-Type: WEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml

9. ETag: 就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag 也会被修改, 所以,ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器 判断一个对象是否改变了。比如前一次请求某个 html 文件时,获得了其 ETag,
	当这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给 WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前ETag 进行对比,然后就知道这个文件有没有改变了。

10. Expired: WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0 的头部。例如:Expires:Sat, 23 May 2009 10:02:12 GMT

11. Host: 客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。例如:Hostrss.sina.com.cn

12. If-Match: 如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。

If-None-Match: 如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。

13. If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。

例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT

If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。

14. If-Range: 浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。 浏览器通过发送请求对象的ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。

15. Last-Modified: WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。

例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT

16. Location: WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。

例如:Location: http://i0.sinaimg.cn/dy/deco/2008/0528/sinahome_0803_ws_005_text_0.gif

17. Pramga: 主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。

例如:Pragma:no-cache

18. Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。

Proxy-Authorization: 浏览器响应代理服务器的身份验证请求,提供自己的身份信息。

19. Range: 浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。

例如:Range: bytes=1173546-

20. Referer: 浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL。

例如:Referer:http://www.sina.com/

21. Server: WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix)

22. User-Agent: 浏览器表明自己的身份(是哪种浏览器)。

例如:User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14

23. Transfer-Encoding: WEB 服务器表明自己对本响应消息体(不是消息体里面的对象) 作了怎样的编码,比如是否分块(chunked)。

例如:Transfer-Encoding: chunked

24. Vary: WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器,在接到第一个请求消息时,其响应消息的头部为: Content-Encoding: gzip; Vary: Content-Encoding, 那么 Cache 服务器会

分析后续请求消息的头部,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用相同的内容编码方法,

这样就可以防止 Cache 服务器用自己Cache 里面压缩后的实体响应给不具备解压能力的浏览器。

例如:Vary:Accept-Encoding

25. Via: 列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,当下一个代理服务器 收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,并把自己的相关信息加到后面, 以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。

例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)telnet 192.168.1.154 80

其它参考文章:

http 头信息精讲

http://blog.csdn.net/zhanghefu/article/details/1610030

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子是空的啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值