|
![]() | 作者: gy769 [gy769]
![]() |
登录 |
1.TCP/IP协议栈 应用层、传输层、互联层和网络接口层。 2.网络接口层 负责数据帧的发送和接收,网络接口层将帧放在网上,或从网上把帧取下来。 互联层 将数据帧封装成internet数据报,并运行必要的路由算法。 传输层 传输协议在计算机之间提供通信会话。传输控制协议TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。用户数据报协议UDP:提供了无连接通信,且不对传送包进行可靠的保证。适合于一次传输小量数据,可靠性则由应用层来负责。 应用层 应用程序通过这一层访问网络。 3.ARP 地址解析协议ARP用于获得在同一物理网络中的主机的硬件地址。 ARP缓存是每个主机都有的 解释本地IP地址和解析远程IP地址不同,ARP广播的是源主机的缺省网关.在路由器上,由IP决定目标IP地址是本地还是远程。如果是本地,路由器用ARP(缓存或广播)获得硬件地址。如果是远程,路由器在其路由表中查找该网关,然后运用ARP获得此网关的硬件地址。数据包被直接发送到下一个目标主机。 ARP缓存 为减少广播量,ARP在缓存中保存地址映射以备用。ARP缓存保存有动态项和静态项。动态项是自动添加和删除的,静态项则保留在CACHE中直到计算机重新启动。 4. internet控制消息协议ICMP是用于报告错误并代表IP对消息进行控制。IP运用互联组管理协议IGMP来告诉路由器,某一网络上指导组中的可用主机。 5.IP是一个无连接的协议,主要就是负责在主机间寻址并为数据包设定路由,在交换数据前 它并不建立会话。因为它不保证正确传递. 6.TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的,主机交换数据必 须建立一个会话。它用比特流通信,即数据被作为无结构的字节流。 7.端口 SOCKETS实用程序使用一个协议端口号来标明自己应用的唯一性。在服务请求时,操作系统动态地为客户端的应用程序分配端口号。 8.套接字 套接字在要领上与文件句柄类似,因为其功能是作为网络通信的终结点。一个应用程序通过定义三部分来产生一个套接字:主机IP地址、服务类型(面向连接的服务是TCP,无连 接服务是UDP)、应用程序所用的端口。TCP滑动窗口用来暂存两台主机间要传送的数据,有点类似CACHE。每个TCP/IP主机有两个滑动窗口:一个用于接收数据,另一个用于发送数据。 9.用户数据报协议UDP提供了无连接的数据报服务。它适用于无须应答并且通常一次只传送 少量数据的应用软件。端口作为多路复用的消息队列使用。 10.IP地址分配 每个IP 地址的长度为4字节,由四个8位域组成,我们通常称之为八位体每个IP地址都是由两部分组成的:网络号 和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同一个网络号,该号在互联网中是唯一的;而主机号确定网络中的一个工作端、服务器、路由器其它TCP/IP主机。 A类地址:可以拥有很大数量的主机,最高位为0,紧跟的7位表示网络号,余24位表示 主机号,总共允许有126个网络。 B类地址:被分配到中等规模和大规模的网络中,最高两位总被置于二进制的10,允许有 16384个网络。 C类地址:被用于局域网。高三位被置为二进制的110,允许大约200万个网络。 有效的主机号 A类:w.0.0.1--w.255.255.254 B类:w.x.0.1--w.x.255.254 C类:w.x.y.1--w.x.y.254 11.子网屏蔽和IP地址 用来封装或“屏 蔽”IP地址的一部分,以区分网络号和主机号。 缺省的子网屏蔽值,它用于一个还没有划分子网的网络。即使是在一个单段网络上,每台主机也都需要这样的缺省值。它的形式依赖于网络的地址类型。在它的4个字节里,所有对应网络号的位都被置为1,例如:C类网地址192.168.0.1和相应的缺省屏蔽值255.255.255.0。 确定数据包的目的地址 屏蔽值和IP地址值做“与”的操作其实是一个内部过程,它用来确定一个数据包是传给本地还是远程网络上的主机。 其相应的操作过程是这样的:当TCP/IP初始化时,主机的IP地址和子网屏蔽值相“与”。在数据包被发送之前,再把目的地址也和屏蔽值作“与”, 这样如果发现源IP地址和目的IP地址相匹配,IP协议就知道数据包属于本地网上的某台主机;否则数据包将被送到路由器上。 12 建立子网 一个网络实际上可能会有多个物理网段,我们把这些网段称之为子网,其使用的IP地址是 由某个网络号派生而得到的。通过划分子网,每个单位可以将复杂的物理网段连接成一个网络. 实现子网划分 遵循这样的准则:1) 确定网络中的物理段数量。(2)确定每个子网需要的主机数。(3) 基于此需求,定义:整个网络的子网屏蔽、每个子网唯一的子网号和每个子网的主机号范围。 13 定义子网屏蔽 定义子网号 定义子网中的主机号 14 实现IP路由 路由就是选择一条数据包传输路径的过程。在决定路由时,IP层查询位于内存中的路由表。 路由器通常被称为网关。 路由器采用的路由方式决定它如何获得路由信息。静态路由是IP协议的函数实现,它需要 创建路由表并进行人工刷新。若路由改变,则静态方式的路由器并不通知彼此的变化,也 不会与动态方式的路由器进行交换。 而动态路由是路由协议的函数实现,相关的协议如:路由信息协议RIP和开放式最短路径 协议OSPF等。这些协议周期性地在采用动态方式的路由器之间进行交换彼此已知的路由 信息,包括信息的变化也能自动通知。 静态路由器只能与有已知接口并正常工作的网络通信。路由器使用动态路由协议(RIP或OSPF)在已知网络间自动交换彼此的路由数据。如果数据变化的话,路由协议会自动更新路由表,同时将更新通知网络上其它的路由器。 一个主机与网络上的其它主机通信时,缺省网关地址必须与本地路由器的接IP地址匹配, 也就是说这个主机对外的通信都是通过缺省网关即本地路由器对本地的接口代理的。 谁知道更深的呢 |
地主 发表时间: 04-02-25 16:32 |
![]() | 回复: abctm [abctm] ![]() |
登录 |
7. TCP/IP协议 你也许听说过TCP/IP协议,那么你知道到底什么是TCP,什么是IP吗?在这一章里面,我们一起来学习这个目前网络上用最广泛的协议. 7.1 网络传输分层 如果你考过计算机等级考试,那么你就应该已经知道了网络传输分层这个概念.在网络上,人们为了传输数据时的方便,把网络的传输分为7个层次.分别是:应用层,表示层,会话层,传输层,网络层,数据链路层和物理层.分好了层以后,传输数据时,上一层如果要数据的话,就可以直接向下一层要了,而不必要管数据传输的细节.下一层也只向它的上一层提供数据,而不要去管其它东西了.如果你不想考试,你没有必要去记这些东西的.只要知道是分层的,而且各层的作用不同. 7.2 IP协议 IP协议是在网络层的协议.它主要完成数据包的发送作用. 下面这个表是IP4的数据包格式 0 4 8 16 32 -------------------------------------------------- |版本 |首部长度|服务类型| 数据包总长 | -------------------------------------------------- | 标识 |DF |MF| 碎片偏移 | -------------------------------------------------- | 生存时间 | 协议 | 首部较验和 | ------------------------------------------------ | 源IP地址 | ------------------------------------------------ | 目的IP地址 | ------------------------------------------------- | 选项 | ================================================= | 数据 | ------------------------------------------------- 下面我们看一看IP的结构定义<netinet/ip.h> struct ip { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4; /* header length */ unsigned int ip_v:4; /* version */ #endif #if __BYTE_ORDER == __BIG_ENDIAN unsigned int ip_v:4; /* version */ unsigned int ip_hl:4; /* header length */ #endif u_int8_t ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_int8_t ip_ttl; /* time to live */ u_int8_t ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src, ip_dst; /* source and dest address */ }; ip_vIP协议的版本号,这里是4,现在IPV6已经出来了 ip_hlIP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5. ip_tos服务类型,说明提供的优先权. ip_len说明IP数据的长度.以字节为单位. ip_id标识这个IP数据包. ip_off碎片偏移,这和上面ID一起用来重组碎片的. ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃. ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议. ip_sum首部校验和,提供对首部数据的校验. ip_src,ip_dst发送者和接收者的IP地址 关于IP协议的详细情况,请参考 RFC791 7.3 ICMP协议 ICMP是消息控制协议,也处于网络层.在网络上传递IP数据包时,如果发生了错误,那么就会用ICMP协议来报告错误. ICMP包的结构如下: 0 8 16 32 --------------------------------------------------------------------- | 类型 | 代码 | 校验和 | -------------------------------------------------------------------- | 数据 | 数据 | -------------------------------------------------------------------- ICMP在<netinet/ip_icmp.h>中的定义是 struct icmphdr { u_int8_t type; /* message type */ u_int8_t code; /* type sub-code */ u_int16_t checksum; union { struct { u_int16_t id; u_int16_t sequence; } echo; /* echo datagram */ u_int32_t gateway; /* gateway address */ struct { u_int16_t __unused; u_int16_t mtu; } frag; /* path mtu discovery */ } un; }; 关于ICMP协议的详细情况可以查看 RFC792 7.4 UDP协议 UDP协议是建立在IP协议基础之上的,用在传输层的协议.UDP和IP协议一样是不可靠的数据报服务.UDP的头格式为: 0 16 32 --------------------------------------------------- | UDP源端口 | UDP目的端口 | --------------------------------------------------- | UDP数据报长度 | UDP数据报校验 | --------------------------------------------------- UDP结构在<netinet/udp.h>中的定义为: struct udphdr { u_int16_t source; u_int16_t dest; u_int16_t len; u_int16_t check; }; 关于UDP协议的详细情况,请参考 RFC768 7.5 TCP TCP协议也是建立在IP协议之上的,不过TCP协议是可靠的.按照顺序发送的.TCP的数据结构比前面的结构都要复杂. 0 4 8 10 16 24 32 ------------------------------------------------------------------- | 源端口 | 目的端口 | ------------------------------------------------------------------- | 序列号 | ------------------------------------------------------------------ | 确认号 | ------------------------------------------------------------------ | | |U|A|P|S|F| | |首部长度| 保留 |R|C|S|Y|I| 窗口 | | | |G|K|H|N|N| | ----------------------------------------------------------------- | 校验和 | 紧急指针 | ----------------------------------------------------------------- | 选项 | 填充字节 | ----------------------------------------------------------------- TCP的结构在<netinet/tcp.h>中定义为: struct tcphdr { u_int16_t source; u_int16_t dest; u_int32_t seq; u_int32_t ack_seq; #if __BYTE_ORDER == __LITTLE_ENDIAN u_int16_t res1:4; u_int16_t doff:4; u_int16_t fin:1; u_int16_t syn:1; u_int16_t rst:1; u_int16_t psh:1; u_int16_t ack:1; u_int16_t urg:1; u_int16_t res2:2; #elif __BYTE_ORDER == __BIG_ENDIAN u_int16_t doff:4; u_int16_t res1:4; u_int16_t res2:2; u_int16_t urg:1; u_int16_t ack:1; u_int16_t psh:1; u_int16_t rst:1; u_int16_t syn:1; u_int16_t fin:1; #endif u_int16_t window; u_int16_t check; u_int16_t urg_prt; }; source发送TCP数据的源端口 dest接受TCP数据的目的端口 seq标识该TCP所包含的数据字节的开始序列号 ack_seq确认序列号,表示接受方下一次接受的数据序列号. doff数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5 urg如果设置紧急数据指针,则该位为1 ack如果确认号正确,那么为1 psh如果设置为1,那么接收方收到数据后,立即交给上一层程序 rst为1的时候,表示请求重新连接 syn为1的时候,表示请求建立连接 fin为1的时候,表示亲戚关闭连接 window窗口,告诉接收者可以接收的大小 check对TCP数据进行较核 urg_ptr如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值 关于TCP协议的详细情况,请查看 RFC793 7.6 TCP连接的建立 TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤.我们把这个连接过程称为"三次握手". 下面我们从一个实例来分析建立连接的过程. 第一步客户机向服务器发送一个TCP数据包,表示请求建立连接. 为此,客户端将数据包的SYN位设置为1,并且设置序列号seq=1000(我们假设为1000). 第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接.于是服务器也向客户端发送一个TCP数据包.因为是响应客户机的请求,于是服务器设置ACK为1,sak_seq=1001(1000+1)同时设置自己的序列号.seq=2000(我们假设为2000). 第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认信息.于是客户机也向服务器发送确认信息.客户机设置ACK=1,和ack_seq=2001,seq=1001,发送给服务器.至此客户端完成连接. 最后一步服务器受到确认信息,也完成连接. 通过上面几个步骤,一个TCP连接就建立了.当然在建立过程中可能出现错误,不过TCP协议可以保证自己去处理错误的. 说一说其中的一种错误. 听说过DOS吗?(可不是操作系统啊).今年春节的时候,美国的五大网站一起受到攻击.攻击者用的就是DOS(拒绝式服务)方式.概括的说一下原理. 客户机先进行第一个步骤.服务器收到后,进行第二个步骤.按照正常的TCP连接,客户机应该进行第三个步骤. 不过攻击者实际上并不进行第三个步骤.因为客户端在进行第一个步骤的时候,修改了自己的IP地址,就是说将一个实际上不存在的IP填充在自己IP数据包的发送者的IP一栏.这样因为服务器发的IP地址没有人接收,所以服务端会收不到第三个步骤的确认信号,这样服务务端会在那边一直等待,直到超时. 这样当有大量的客户发出请求后,服务端会有大量等待,直到所有的资源被用光,而不能再接收客户机的请求. 这样当正常的用户向服务器发出请求时,由于没有了资源而不能成功.于是就出现了春节时所出现的情况. |
B1层 发表时间: 04-02-25 18:00 |
![]() | 回复: abctm [abctm] ![]() |
登录 |
TCP/IP的通讯协议 这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。 TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为: 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。 网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。 TCP/IP中的协议 以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的: 1. IP 网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。 2. TCP 如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。 面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。 3.UDP UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。 欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。 4.ICMP ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。 5. TCP和UDP的端口结构 TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。 两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认: 源IP地址---发送包的IP地址。 目的IP地址---接收包的IP地址。 源端口---源系统上的连接的端口。 目的端口---目的系统上的连接的端口。 端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。 |
B2层 发表时间: 04-02-25 18:01 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号