网络协议详解.docx
《网络协议详解.docx》由会员分享,可在线阅读,更多相关《网络协议详解.docx(13页珍藏版)》请在冰点文库上搜索。
网络协议详解
网络协议详解-ICMP
一、ICMP协议
ICMP全称InternetControlMessageProtocol,即网际控制消息协议。
是作为TCP/IP协议体系的一个组成部分出现的。
它的基本用途是对网络的故障进行侦测并返回报告。
ICMP协议在网络中被广泛使用,其中,路由器等一些设备会经常需要使用到这个工具,一台独立主机也会使用这个工具向其他的路由器、中间设备或者主机通告错误信息或者自己的状态更新,这就可以解释为什么自己的金山网镖怎么总是拦截来自一些莫名其妙的IP地址的ICMP数据包了,比如,局域网用户的金山网镖可能在高安全级下经常报告收到来自224.0.0.0的ICMP数据包,这往往就是网段内路由器发出的更新信息。
需要说明的是,下面对一些ICMP消息的代码域的介绍可能会非常难于理解,不必管他,只需要对ICMP的类型进行了解就够了,类型代码我也一并加上来是为了满足一些希望深入了解ICMP的网友的。
每一条ICMP消息都包含了三个区域来定义这条消息所需要达到的目的和一个奇偶校验值,这三个区域分别是:
类型、代码和校验区域。
类型域用于鉴别ICMP消息,代码域则包含了与类型域相关联的一些详细信息,而校验域则提供了一个判断一条ICMP消息完整性的方法。
类型域所规定的类型如下(注意:
类型描述部分不翻译,读者自行理解英文原文更好):
类型描述
------------------
0EchoReply
3DestinationUnreachable
4SourceQuench
5RedirectMessage
8EchoRequest
11TimeExceeded
12ParameterProblem
13TimestampRequest
14TimestampReply
15InformationRequest(NoLongerUsed)
16InformationReply(NoLongerUsed)
17AddressMaskRequest
18AddressMaskReply
1、回显请求和回显响应(EchoRequestandEchoReply,即类型0和8)
回显请求(EchoRequest)是所有ICMP消息中最常用的,通常用来检测网络连接是否通畅,大家熟悉的ping就是用来发送这两个请求的。
一个回显请求数据包会包含类型域8(echorequest)和代码域0,而一个回显响应(echoreply)数据包则会包含类型域0和代码域0。
2、目的地不可到达(DestinationUnreachable,即类型3)
当一个ICMP数据包无法正常传送,就会返回一个类型3的DestinationUnreachable信息。
类型3的ICMP消息一共有15个代码值,列表如下,同样,不会翻译描述栏。
读者可能对前面说的ICMP“代码域则包含了与类型域相关联的一些详细信息”这句话感觉很抽象,这里就好理解了,所谓的“域类型域相关联的一些详细信息”就是下面的这些代码值。
需要注意的是,这只是类型3的代码值,下面还有类型5的代码值,这些代码值都是与一个特定类型域相关联的,类型3的代码值不能用于类型5的,虽然数字一样,但是意义完全不同,这一点一定要注意。
类型3
代码
值描述
----------------
0NetworkUnreachable
1HostUnreachable
2ProtocolUnreachable
3PortUnreachable
4FragmentationneededandDF(Don'tFragment)set
5Sourceroutefailed
6DestinationNetworkunknown
7DestinationHostunknown
8SourceHostisolated
9CommunicationwithDestinationNetworkAdministrativelyProhibited
10CommunicationwithDestinationHostAdministrativelyProhibited
11NetworkUnreachableforTypeofService
12HostUnreachableforTypeofService
13CommunicationAdministrativelyProhibitedbyFiltering
14HostPrecedenceViolation
15PrecedenceCutoffinEffect
3、源结束(SourceQuench,即类型4)
一个ICMP源结束(SourceQuench)消息包含类型域4和代码域0。
当ICMP消息的目的地不能处理通讯的时候,一个源结束消息就会在被立即发送出去,几乎和消息源的发送速度同步进行。
源结束消息会告诉消息的发送源立即降低自己的消息发送速度。
在发送元降低自己的发送频率到目的地一端可以接受的程度前,目的地一端会一直发送源结束消息给发送源(打个比方,你是乒乓球陪练员,你一分钟发60个球给对方,对方无法接受这么多的球,就会大声的对你喊慢点,你就会减少自己每分钟的发球数或者根本停止,等对方可以接受你每分钟的发球数再进行对练)。
4、重定向消息(RedirectMessage,即类型5)
当一个中间设备发现一个正在被请求的路径可以通过本地或者一条更好的路径访问的时候,一条重定向消息就会发送出去。
重定向消息包含了类型域5,并且其代码域可以有以下几个值定义:
类型5
代码
值描述
----------------
0RedirectdatagramsfortheNetwork
1RedirectdatagramsfortheHost
2RedirectdatagramsfortheTypeofServiceandNetwork
3RedirectdatagramsfortheTypeofServiceandHost
5、超时(TimeExceeded,即类型11)
当路由器或者一个主机因为超时而丢弃了数据包的时候,就会产生一个类型11的超时ICMP信息。
超时ICMP消息的代码域可以有两个值:
0和1。
当数据包的跃点计数超出规定并且数据包被丢弃(这句话不用过多的看)的时候,代码值就是0;而当分开的IP数据包的重组时间超过了规定时间时,代码值就是1。
6、参数有问题(ParameterProblem,即类型12)
当一个中间设备或者主机发现无法处理一个数据包的时候,一个类型12的ICMP消息就会被发送出去,导致这个ICMP消息发送出去的原因一般是错误的消息头或者丢失的选项。
如果导致这个消息产生的原因是一个必需的选项丢失,那么这条消息的代码值就是1;如果返回的消息代码值是0,那么消息的指针域就会包含出问题的这个数据包头的八进制数据。
7、时间戳请求和时间戳回应(TimestampRequest&TimestampReply,即类型13和14)
时间戳请求和时间戳回应是解决不同设备之间时间同步问题的根本办法。
时间戳请求的类型是13,而时间戳回应的类型是14。
但是由于这个解决时间同步的办法是粗放而且不可靠的,所以这个办法并没有被广泛使用。
8、消息请求和消息回应(InformationRequest&InformationReply,即类型15和16)
这两个ICMP类型最初是为使一台启动主机能够实现自主分配IP地址而设计的,但是现在已经没有使用了,取而代之的是BOOTP和DHCP,具体信息请自行查看相关文档。
9、地址掩码请求和地址掩码回应(AddressMaskRequest&AddressMaskReply,即类型17和18)
一台可联网机器在探测本地网络中使用的子网掩码的时候,就会发送类型17的地址掩码请求ICMP消息。
而扮演中间层设备的计算机或者设备就会回应一个类型18的地址掩码回应ICMP消息。
网络协议详解-TCP/IP
二、TCP/IP协议简介
TCP/IP是TransmissionControlProtocol和InternetProtocol的缩写。
TCP/IP是Internet主干网络的核心组成部分。
它描述了一个四层模型,即网络访问层、网际层、传输层(也叫做主机到主机层)、进程/应用层,在一个TCP/IP网络上,数据被切割成一个一个的小数据包发送出去,这些数据包都包含了所要去往的目的地地址,到达目的地以后,会被自动的合并起来。
对于这四层,可以这么理解:
在一家肉类加工厂中,有许多的设备、人员等,其中,加工厂中的仓库管理员就是这里所说的网络访问层(中间层或者叫做链路层),他们控制原料的入库和产成品的出库,但是他们不过问生产(没有应用);厂内进行原材料初加工和产成品运输的工人就是这里所说的网际层,初加工人员从仓库中把肉提出来,进行初步的加工,然后送到流水线进行生产,而运输工人就把生产完成的肉制品送到仓库;而流水线就类似于传输层(主机到主机层)了,初加工后的肉制品被一节一节的传送、处理;最后就是包装工人了,他们就是TCP/IP体系中的进程/应用层,他们把从流水线上送过来的半成品进行各类细加工并进行包装成为产成品。
不同于最初的OSI模型,TCP/IP更加注重对互连设备之间的数据传输,而OSI模型则更加注重于对各个设备之间通信原理的描述,也就是说,TCP/IP是一个严格的市场标准,而OSI模型则是一个学术标准(实际上,TCP/IP的通讯也遵循OSI模型描述的原理)。
有关OSI模型的详细信息,请自行参考相关书籍,这里重点说明一下TCP/IP协议模型(从模型的底层往高层介绍)。
1、网络访问层
网络访问层也叫做中间层或链路层,它负责通过网络设备发送TCP/IP数据包,并通过网络设备接收TCP/IP数据包,这一层没有任何应用。
TCP/IP协议被设计为不依赖于任何网络访问方式、体系结构和介质,因此,TCP/IP可以跨越不同的网络类型进行通讯,比如基于以太网(Ethernet)或令牌环(TokenRing)技术的局域网(LAN)同基于X.25或帧中继技术的广域网(WAN)进行通讯。
2、网际层
网际层即InternetLayer,它负责数据包的寻址、封装和路由功能。
网际层的核心协议就是IP协议、ICMP协议、IGMP协议、ARP协议。
其中ICMP协议在第一部分已经说明,ARP协议是地址转换协议的英文缩写,由于在金山网镖中不牵涉到,因此不作多说。
这里需要介绍一下IP协议和IGMP协议
A、IP协议(这里只简单介绍IP协议,对于IP网络中的命名、寻址、子网化等等不作介绍,读者可以参考更加专业、详细的书籍)
IP协议负责将数据包切割成一小块一小块的,然后每个数据包都加上一个目的地地址,并且通过选择一定的路径发送出去,最后到达目的地以后又重新把一个个的小数据包合并成一个完整的数据。
在一个IP数据包中需要包含很丰富的信息,这其中包括:
①所使用IP协议的版本号,即IPv4或者IPv6;
②IP数据包头的长度(可以让接收端知道IP头在何处结束,并且从何处开始读取数据);
③IP数据包的总长度(以字节为单位,最大只能有65535字节,超出这个范围,接收端将会认为这个IP报文被破坏而丢弃);
④生存时间(告诉传送过程中经过的设备这个IP报文允许继续传输下去的时间,一般是15-30秒,超过这个时间,设备将会丢弃数据包,并给发送者一个回执,告诉发送方它发送的数据包丢弃或者丢失了,让它重新发送);
⑤处理这个IP报文的上层协议号(网际层的上层);
⑥校验IP数据包头数据有效性的值;
⑦此IP报文发送者的地址;
⑧IP报文将要到达的地址。
一个IP数据包包含的信息并非只有这8项,但是最主要的信息只有这8项,其余的基本上是一些可选信息。
IP协议拥有丰富信息并且可以实现一些功能,但是由于IP只是一个网际层协议,所以IP协议不足以实现高层的一些应用服务。
B、IGMP协议
是InternetGroupManagementProtocol的缩写,用于IP多点传送(多播)。
所谓多点传送就是指在网络中的单一发送者和多个接收者的通讯。
IGMP用于在支持多点传送的路由器和支持多点传送的网络组成员之间交换成员状态。
3、传输层
传输层也叫做主机到主机层。
这一层为下一节要介绍的应用层提供会话和数据包通讯服务。
这一层的核心协议就是传输控制协议,即TCP(TransmissionControlProtocol)和用户数据包协议,即UDP(UserDatagramProtocol)。
这个部分是金山网镖IP规则编辑应用过程中的所牵涉到的重点。
A、TCP协议
即TransferControlProtocol(传输控制协议)的缩写。
TCP协议使用IP(但是注意,使用IP并不意味着TCP和IP是包含关系,二者是独立的协议,就像前面所举例的原材料初加工、产成品运输的工人和流水线的关系一样,二者有联系,但是却独立。
),提供了一种端到端的、基于连接的、可靠的通信服务。
之所以说它可靠,首先是因为每一个TCP连接都会在发送端和接收端之间产生三次预先通讯,用术语来说就是TCP的三次握手(Handshake),三次握手的过程会在稍微后面提到。
它负责确定一个TCP连接,并且负责数据包的发送确认和发送的次序,同时负责重新传送在传输过程中破坏或者丢失的数据包;它能够对成功接收的数据包进行回应,可以测试所接收数据包的完整性,并把接收到的次序错乱的数据包进行顺序整理,这些是TCP通讯可靠性的另一个方面。
由于TCP是用户应用和诸多网络协议之间的纽带,因此TCP必须能够同时接收多个应用的数据,并且必须具备跟踪记录到达的数据包需要转发到的应用程序的功能,这个功能是通过端口来实现的。
对于端口,相信使用只要是上网的人一定不会陌生这个词,在很多的文章、软件中广泛使用到了这个词汇,但是相信也有不少人对“端口”这个词是知其然不知其所以然的。
端口的作用在上面已经说到了,这里要进行深入了解的话,需要介绍一下TCP协议数据包头的结构。
在TCP协议头的结构介绍中,你可以获得金山网镖IP规则编辑器中可能让你有点莫名其妙的“标志”的相关信息(在日志中也存在,你可能经常收到类似于“来自x.x.x.x的TCP请求,标志位:
ACK”这样的报告)。
注意:
以下内容需要一些计算机原理基础知识,如果不明白,可以不用管那些“位”(Bit)
TCP协议头最少有20字节(Bytes)。
TCP协议头包含以下部分(称为域):
●TCP源端口:
用于指示源端口的数值,这是一个16位的二进制数(2个字节,2Bytes)。
源端口和源IP的作用就是标明数据包的返回地址。
由于是一个16位二进制数,也就意味着有65535个可用端口;
●TCP目的端口:
用于指示目的端口的数值,也是一个16位二进制数(2Bytes)。
目的端口用来指明接收端上应用程序的地址接口;
很显然,在日常应用中,一些常规应用使用的端口是众所周知的,比如HTTP服务使用80端口、FTP服务使用21端口等等,这些是经过Internet的管理者ICANN所定义了的,可以被所有主机识别,但是面对65535个如此庞大的端口数目,没有必要对所有的端口一一定义,于是ICANN只定义了前面1024个端口(0-1023),而大于1023的端口则称为高端端口,不被定义。
用户的应用程序可以随机打开高端端口进行通讯(当然也可以使用定义了的1024个端口中的一个,但是需要小心的是,前1024个端口是被各种协议、服务广泛使用的,如果你的应用程序使用这些端口,将可能和其他的服务产生冲突,无法通信)。
需要注意的是,你并不能直观地看到一个TCP包中所包含的这些端口信息,金山网镖也不会剖开一个封包告诉你一大堆的二进制数让你知道端口号,你所看到的日志以及在IP规则编辑器中需要指定的端口号,其实是一个叫做套接字的东西,所谓套接字就是由主机端口和IP地址组合而成,类似于127.0.0.1:
3389这样的形式。
●TCP序列号:
这是一个32位二进制数(4Bytes)。
一个TCP数据包中包含的序列号是提供给接收方计算机使用的,目的在于把到达目的地的乱七八糟的数据包重新排列;
●TCP应答号:
也是一个32位二进制数(4Bytes)。
就是使用ACK(应答)标志下一个希望收到的数据包的第一个字节。
这个部分只有在后面将要说到的ACK标志被设为有效的时候才存在;
●数据偏移:
是一个32位二进制数。
告诉接收方,数据的开始位置在什么地方;
●[保留域:
一个6位二进制数,为将来可能的用途保留;
●TCP标志位(也称控制位,有的日志报告使用英文Flag):
一共有六位标志位。
它们分别是URG、ACK、PSH、RST、SYN、FIN。
下面会对这六个标志位进行一些介绍,并且告诉你一些网络安全上的常规知识:
※URG:
此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;
※ACK:
此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:
0和1,为1的时候表示应答域有效,反之为0;
※PSH:
这个标志位表示Push操作。
所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;
※RST:
这个标志表示连接复位请求。
用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包;
※SYN:
表示同步序号,用来建立连接。
SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被相应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。
扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手;
※FIN:
表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。
这个标志的数据包也经常被用于进行端口扫描。
当一个FIN标志的TCP数据包发送到一台计算机的特定端口,如果这台计算机响应了这个数据,并且反馈回来一个RST标志的TCP包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。
需要说明的是,金山网镖的日志报告使用的不是这些标志位的全称,而是使用的这些标志位的首字母,比如拦截到一个包含FIN标志的TCP数据包将会报告x.x.x.x的TCP数据包:
F。
还有一点,你的日志可能报告x.x.x.x的TCP数据包:
NULL,这是什么?
NULL标明发送给你的数据包不包含任何标志位,你收到这种数据包,很多情况下意味着你被扫描,扫描者发送NULL数据包给你,如果你的计算机发送回去了一个FIN标志的TCP数据包,就表明他探测的端口在你的计算机上不存在,但是你的计算机就已经被确定存在了,这样他就可以使用其他的扫描方式进行端口探测。
有一些特殊的扫描方式可以绕过不严谨的防火墙。
了解到了TCP标志位的含义,就可以了解TCP的三次握手是怎么进行的了:
发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手;接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让发送端发送一个确认数据包,这是第二次握手;最后,发送端发送一个SYN=0,ACK=1的数据包给接收端,告诉它连接已被确认,这就是第三次握手。
之后,一个TCP连接建立,开始通讯。
●TCP窗口(TCPWindow):
一个16位二进制数。
是接收端使用的一个域,它将告诉发送者,它想收到的TCP数据包大小;
●TCP校验和(Checksum):
这是包含在一个TCP头的中16位二进制校验数值。
发送端针对数据包进行一次计算,得到一个数值,然后接收端也会进行同样的计算。
这样做是为了充分保证被传送的TCP数据包没有一丝更改,如果接收端进行计算后得到和发送端同样的结果,则表明这个数据包没有更改,反之则表示数据包被更改,将被丢弃;
●紧急指针域:
这是一个可选的16位二进制指针。
所谓指针,就是指向某一个段落或者记录、地址的标志,可以这么理解:
你开车走在错综复杂的道路上,不知道该往哪走,这时候一个人用手给你向东方指出,于是你就往东发行驶,这个给你指路的人也就可以理解为指针。
这个指针域只有在前面所说的URG标志为存在的时候才会有效。
紧急指针指向TCP段内的最后一个字节,用来督促各种网络设备尽快的处理这个数据包;
●选项域:
一个可变长度的区域,至少有1字节(Byte)。
如果这个字节为0,表示没有选项,并且选项域结束;如果为1,表示没有操作;如果为2,表示下四个字节包含了发送端的最大段长度(如果不赋值,表示段没有限制);
●可变长填充域:
这个域是用来保证可以预测空间大小的。
为了保证TCP头是32位的整数倍,这个域会被加入额外的0。
网络协议详解-UDP--
B、UDP协议
UDP是UserDatagramProtocol(用户数据报协议)的英文缩写。
UDP只提供一种基本的、低延迟的被称为数据报的通讯。
所谓数据报,就是一种自带寻址信息,从发送端走到接收端的数据包。
UDP协议经常用于路由表数据交换转发和系统信息、网络监控数据等的交换。
UDP协没有TCP那样的三次握手并且基于数据报,因此UDP不基于连接,也没有TCP那样丰富的头信息以实现诸多功能。
UDP数据报的头只包含了类似于TCP中包含的UDP源端口、UDP目的端口号、两个字节的校验和域、两个字节的信息长度域(用来告诉接收端信息的大小,让接收端判断信息是否有效)。
由于UDP协议是如此简单,所以不要指望UDP连接会像TCP连接那样可靠,它一点都不可靠,UDP只负责尽力的转发数据包,但是却不会把错误的数据报重新发送,它会丢弃掉所有被破坏或者损坏的数据报,并且继续后面的传送,至于被丢弃的部分,发送端不知道,也不会被接收端要求重新发送;除此之外,UDP不具备把乱序到达的数据报重新排列的功能(因为没有TCP头中包含的TCP序列号),这样一来,UDP便是完全不可靠的,因为你根本就无法保证你收到的数据是完整的。
但是,UDP协议的不可靠并不代表UDP是毫无用处的,恰恰相反,没有了和TCP一样的复杂头信息,各种设备处理UDP数据报的时间将会大大缩短,效率比TCP要高得多,你可以想象,你看13页书比看4页书需要用的时间谁会更多。
由于UDP处理的这种高效性,UDP往往被用于那些数据报不断出现的应用,比如IP电话或者实时视频会议,也被用于在路由器之间传输路由表更新信息、传送网络管理和监控数据等,DNS也是使用UDP协议进行域名转换。
4、进程/应用层
应用层赋予应用程序访问其它层所提供服务的能力,并且规定应用程序使用何种协议进行数据交换。
这一层包含了众多的服务协议,是跟终端用户最为接近的一层。
这一层中包含的服务协议有:
HTTP(HypertextTransferProtocol超文本传输协议)、FTP(FileTransferProtocol文件传输协议)、SMTP(TheSimpleMail