×
研发资源 > 电子百科

TCP IP协议

TCP/IP(Transmission Control Protocol/Internet Protocol的简写,中文译名为传输控制协议/互联网络协议)协议是Internet最基本的协议,简单地说,就是由底层的IP协议和TCP协议组成的。
  众所周知,如今电脑上因特网都要作TCP/IP协议设置,显然该协议成了当今地球村“人与人”之间的“牵手协议”。
  1997年,为了褒奖对因特网发展作出突出贡献的科学家,并对TCP/IP协议作出充分肯定,美国授予为因特网发明和定义TCP/IP协议的文顿·瑟夫和卡恩“国家技术金奖”。这无疑使人们认识到TCP/IP协议的重要性。
  在阿帕网(ARPR)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容,在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。当时美国的状况是,陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑,每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。
  当时科学们提出这样一个理念:“所有电脑生来都是平等的。”为了让这些“生来平等”的电脑能够实现“资源共享”就得在这些系统的标准之上,建立一种大家共同都必须遵守的标准,这样才能让不同的电脑按照一定的规则进行“谈判”,并且在谈判之后能“握手”。
  在确定今天因特网各个电脑之间“谈判规则”过程中,最重要的人物当数瑟夫(Vinton G.Cerf)。正是他的努力,才使今天各种不同的电脑能按照协议上网互联。瑟夫也因此获得了与克莱因罗克(“因特网之父”)一样的美称“互联网之父”。
  瑟夫从小喜欢标新立异,坚强而又热情。中学会书时,就被允许使用加州大学洛杉矶分校的电脑,他认为“为电脑编程序是个非常激动人心的事,…只要把程序编好,就可以让电脑做任何事情。”1965年,瑟夫从斯坦福大学毕业到IBM的一家公司当系统工程师,工作没多久,瑟夫就觉得知识不够用,于是到加州大学洛杉矶分校攻读博士,那时,正逢阿帕网的建立,“接口信号处理机”(IMP)的研试及网络测评中心的建立,瑟夫也成了著名科学家克莱因罗克手下的一位学生。瑟夫与另外三位年轻人(温菲尔德、克罗克、布雷登)参与了阿帕网的第一个节点的联接。此后不久,BBN公司对工作中各种情况发展有很强判断能力、被公认阿帕网建成作出巨大贡献的鲍伯·卡恩(Bob Kahn)也来到了加州大学洛杉矶分校。 在那段日子里,往往是卡恩提出需要什么软件,而瑟夫则通宵达旦地把符合要求的软件给编出来,然后他们一起测试这些软件,直至能正常运行。当时的主要格局是这样的,罗伯茨提出网络思想设计网络布局,卡恩设计阿帕网总体结构,克莱因罗克负责网络测评系统,还有众多的科学家、研究生参与研究、试验。69年9月阿帕网诞生、运行后,才发现各个IMP连接的时候,需要考虑用各种电脑都认可的信号来打开通信管道,数据通过后还要关闭通道。否则这些IMP不会知道什么时候应该接收信号,什么时候该结束,这就是我们现在所说的通信“协议”的概念。70年12月制定出来了最初的通信协议j 由卡恩开发、瑟夫参与的“网络控制协议”(NCP),但要真正建立一个共同的标准很不容易,72年10月国际电脑通信大会结束后,科学家们都在为此而努力。“包切换”理论为网络之间的联接方式提供了理论基础。卡恩在自己研究的基础上,认识到只有深入理解各种操作系统的细节才能建立一种对各种操作系统普适的协议,73年卡恩请瑟夫一起考虑这个协议的各个细节,他们这次合作的结果产生了目前在开放系统下的所有网民和网管人员都在使用的“传输控制协议”(TCP,Transsmission-Control Protocol)和“因特网协议”(IP,Internet Protocol)即TCP/IP协议。
  通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因行网的每一台电脑规定一个地址。1974年12月,卡恩、瑟夫的第一份TCP协议详细说明正式发表。当时美国国防部与三个科学家小组签定了完成TCP/IP的协议,结果由瑟夫领衔的小组捷足先登,首先制定出了通过详细定义的TCP/IP协议标准。当时作了一个试验,将信息包通过点对点的卫星网络,再通过陆地电缆,再通过卫星网络,再由地面传输,贯串欧洲和美国,经过各种电脑系统,全程9.4万公里竟然没有丢失一个数据位,远距离的可靠数据传输证明了TCP/IP协议的成功。
  1983年1月1日,运行较长时期曾被人们习惯了的NCP被停止使用,TCP/IP协议作为因特网上所有主机间的共同协议,从此以后被作为一种必须遵守的规则被肯定和应用。正是由于TCP/IP协议,才有今天“地球村”因特网的巨大发展。
  什么是 TCP/IP?
  TCP/IP 是供已连接因特网的计算机进行通信的通信协议。
  TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)。
  TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。
  TCP/IP协议介绍
  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。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。
  IP(Internet Protocol)协议的英文名直译就是:因特网协议。从这个名称我们就可以知道IP协议的重要性。在现实生活中,我们进行货物运输时都是把货物包装成一个个的纸箱或者是集装箱之后才进行运输,在网络世界中各种信息也是通过类似的方式进行传输的。IP协议规定了数据传输时的基本单元和格式。如果比作货物运输,IP协议规定了货物打包时的包装箱尺寸和包装的程序。 除了这些以外,IP协议还定义了数据包的递交办法和路由选择。同样用货物运输做比喻,IP协议规定了货物的运输方法和运输路线。
  TCP协议
  我们已经知道了IP协议很重要,IP协议已经规定了数据传输的主要内容,那TCP(Transmission Control Protocol)协议是做什么的呢?不知大家发现没有,在IP协议中定义的传输是单向的,也就是说发出去的货物对方有没有收到我们是不知道的。就好像8毛钱一份的平信一样。那对于重要的信件我们要寄挂号信怎么办呢?TCP协议就是帮我们寄“挂号信”的。TCP协议提供了可靠的面向对象的数据流传输服务的规则和约定。简单的说在TCP模式中,对方发一个数据包给你,你要发一个确认数据包给对方。通过这种确认来提供可靠性。
  TCP/IP(Transmission Control Protocol/Internet Protocol的简写,中文译名为传输控制协议/互联网络协议)协议是Internet最基本的协议,简单地说,就是由底层的IP协议和TCP协议组成的。TCP/IP协议的开发工作始于70年代,是用于互联网的第一套协议。
  1.1 TCP/IP参考模型
  TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:
  应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
  传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
  互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
  网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
  1. 2 网间协议IP
  Internet 上使用的一个关键的底层协议是网际协议,通常称IP协议。我们利用一个共同遵守的通信协议,从而使 Internet 成为一个允许连接不同类型的计算机和不同操作系统的网络。要使两台计算机彼此之间进行通信,必须使两台计算机使用同一种"语言"。通信协议正像两台计算机交换信息所使用的共同语言,它规定了通信双方在通信中所应共同遵守的约定。
  计算机的通信协议精确地定义了计算机在彼此通信过程的所有细节。例如,每台计算机发送的信息格式和含义,在什么情况下应发送规定的特殊信息,以及接收方的计算机应做出哪些应答等等。
  网际协议IP协议提供了能适应各种各样网络硬件的灵活性,对底层网络硬件几乎没有任何要求,任何一个网络只要可以从一个地点向另一个地点传送二进制数据,就可以使用IP协议加入 Internet 了。
  如果希望能在 Internet 上进行交流和通信,则每台连上 Internet 的计算机都必须遵守IP协议。为此使用 Internet 的每台计算机都必须运行IP软件,以便时刻准备发送或接收信息。
  IP协议对于网络通信有着重要的意义:网络中的计算机通过安装IP软件,使许许多多的局域网络构成了一个庞大而又严密的通信系统。从而使 Internet 看起来好像是真实存在的,但实际上它是一种并不存在的虚拟网络,只不过是利用IP协议把全世界上所有愿意接入 Internet 的计算机局域网络连接起来,使得它们彼此之间都能够通信。
  1.3 传输控制协议TCP
  尽管计算机通过安装IP软件,从而保证了计算机之间可以发送和接收资料,但IP协议还不能解决资料分组在传输过程中可能出现的问题。因此,若要解决可能出现的问题,连上 Internet 的计算机还需要安装TCP协议来提供可靠的并且无差错的通信服务。
  TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。
  传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在 Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。
  众所周知, Internet 是一个庞大的国际性网络,网络上的拥挤和空闲时间总是交替不定的,加上传送的距离也远近不同,所以传输资料所用时间也会变化不定。TCP协议具有自动调整"超时值"的功能,能很好地适应 Internet 上各种各样的变化,确保传输数值的正确。
  因此,从上面我们可以了解到:IP协议只保证计算机能发送和接收分组资料,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。
  综上所述,虽然IP和TCP这两个协议的功能不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,并且在功能上也是互补的。只有两者的结合,才能保证 Internet 在复杂的环境下正常运行。凡是要连接到 Internet 的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称作TCP/IP协议。
  1. 4 IP地址及其分类
  在Internet上连接的所有计算机,从大型机到微型计算机都是以独立的身份出现,我们称它为主机。为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址。就好像每一个住宅都有唯一的门牌一样,才不至于在传输资料时出现混乱。
  Internet的网络地址是指连入Internet网络的计算机的地址编号。所以,在Internet网络中,网络地址唯一地标识一台计算机。
  我们都已经知道,Internet是由几千万台计算机互相连接而成的。而我们要确认网络上的每一台计算机,靠的就是能唯一标识该计算机的网络地址,这个地址就叫做IP(Internet Protocol的简写)地址,即用Internet协议语言表示的地址。
  目前,在Internet里,IP地址是一个32位的二进制地址,为了便于记忆,将它们分为4组,每组8位,由小数点分开,用四个字节来表示,而且,用点分开的每个字节的数值范围是0~255,如202.116.0.1,这种书写方法叫做点数表示法。
  IP地址可确认网络中的任何一个网络和计算机,而要识别其它网络或其中的计算机,则是根据这些IP地址的分类来确定的。一般将IP地址按节点计算机所在网络规模的大小分为A,B,C三类,默认的网络屏蔽是根据IP地址中的第一个字段确定的。
  1. A类地址
  A类地址的表示范围为:0.0.0.0~126.255.255.255,默认网络屏蔽为:255.0.0.0;A类地址分配给规模特别大的网络使用。A类网络用第一组数字表示网络本身的地址,后面三组数字作为连接于网络上的主机的地址。分配给具有大量主机(直接个人用户)而局域网络个数较少的大型网络。例如IBM公司的网络。
  2. B类地址
  B类地址的表示范围为:128.0.0.0~191.255.255.255,默认网络屏蔽为:255.255.0.0;B类地址分配给一般的中型网络。B类网络用第一、二组数字表示网络的地址,后面两组数字代表网络上的主机地址。
  3. C类地址
  C类地址的表示范围为:192.0.0.0~223.255.255.255,默认网络屏蔽为:255.255.255.0;C类地址分配给小型网络,如一般的局域网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。
  RFC 1918留出了3块IP地址空间(1个A类地址段,16个B类地址段,256个C类地址段)作为私有的内部使用的地址。在这个范围内的IP地址不能被路由到Internet骨干网上;Internet路由器将丢弃该私有地址。
  IP地址类别 RFC 1918内部地址范围
  A类 10.0.0.0到10.255.255.255
  B类 172.16.0.0到172.31.255.255
  C类 192.168.0.0到192.168.255.255
  使用私有地址将网络连至Internet,需要将私有地址转换为公有地址。这个转换过程称为网络地址转换(Network Address Translation,NAT),通常使用路由器来执行NAT转换。
  实际上,还存在着D类地址和E类地址。但这两类地址用途比较特殊,在这里只是简单介绍一下:D类地址称为广播地址,供特殊协议向选定的节点发送信息时用。E类地址保留给将来使用。
  连接到Internet上的每台计算机,不论其IP地址属于哪类都与网络中的其它计算机处于平等地位,因为只有IP地址才是区别计算机的唯一标识。所以,以上IP地址的分类只适用于网络分类。
  在Internet中,一台计算机可以有一个或多个IP地址,就像一个人可以有多个通信地址一样,但两台或多台计算机却不能共享一个IP地址。如果有两台计算机的IP地址相同,则会引起异常现象,无论哪台计算机都将无法正常工作。
  顺便提一下几类特殊的IP地址:
  1. 广播地址 目的端为给定网络上的所有主机,一般主机段为全0
  2. 单播地址 目的端为指定网络上的单个主机地址
  3. 组播地址 目的端为同一组内的所有主机地址
  4. 环回地址 127.0.0.1 在环回测试和广播测试时会使用
  1.5 子网的划分
  若公司不上Internet,那一定不会烦恼IP地址的问题,因为可以任意使用所有的IP地址,不管是A类或是B类,这个时候不会想到要用子网,但若是上Internet那IP地址便弥足珍贵了,目前全球一阵Internet热,IP地址已经愈来愈少了,而所申请的IP地址目前也趋保守,而且只有经申请的IP地址能在Internet使用,但对某些公司只能申请到一个C类的IP地址,但又有多个点需要使用,那这时便需要使用到子网,这就需要考虑子网的划分,下面简介子网的原理及如何规划。
  1.5.1 子网掩码(Subnet Mask)的介绍
  设定任何网络上的任何设备不管是主机、个人电脑、路由器等皆需要设定IP地址,而跟随着IP地址的是所谓的子网掩码(NetMask,Subnet Mask),这个子网掩码主要的目的是由IP地址中也能获得网络编码,也就是说IP地址和子网掩码作和而得到网络编码,如下所示:
  IP地址
  192.10.10.6 11000000.00001010.00001010.00000110
  子网掩码
  255.255.255.0 11111111.11111111.11111111.00000000
  AND
  -------------------------------------------------------------------
  Network Number
  192.10.10.0 11000000.00001010.00001010.00000000
  子网掩码有所谓的默认值,如下所示
  类 IP地址 范围 子网掩码
  A 1.0.0.0-126.255.255.255 255.0.0.0
  B 128.0.0.0-191.255.255.255 255.255.0.0
  C 192.0.0.0-223.255.255.255 255.255.255.0
  在预设的子网掩码(Net Mask)都只有255的值,在谈到子网掩码(Subnet Mask)时这个值便不一定是255了。在完整一组C类地址中如203.67.10.0-203.67.10.255 子网掩码255.255.255.0,203.67.10.0称之网络编码(Network Number,将IP 地址和子网掩码作和),而203.67.10.255是广播的IP地址,所以这两者皆不能使用,实际只能使用203.67.10.1--203.67.10.254等254个IP地址,这是以255.255.255.0作子网掩码的结果,而所谓Subnet Msk尚可将整组C类地址分成数组网络编码,这要在子网掩码上作手脚,若是要将整组C类地址分成2个网络编码那子网掩码设定为255.255.255.192,若是要将整组C类分成8组网络编码则子网掩码要为255.255.255.224,这是怎么来的,由以上知道网络编码是由IP地址和子网掩码作AND而来的,而且将子网掩码以二进制表示法知道是1的会保留,而为0的去掉
  192.10.10.193--11000000.00001010.00001010.10000001
  255.255.255.0--11111111.11111111.11111111.00000000
  --------------------------------------------------------------
  192.10.10.0--11000000.00001010.00001010.00000000
  以上是以255.255.255.0为子网掩码的结果,网络编码是192.10.10.0,若是使用255.255.255.224作子网掩码结果便有所不同
  192.10.10.193--11000000.00001010.00001010.10000000
  255.255.255.224--11111111.11111111.11111111.11100000
  --------------------------------------------------------------
  192.10.10.192--11000000.00001010.00001010.10000000
  此时网络编码变成了192.10.10.192,这便是子网。那要如何决定所使用的子网掩码,255.255.255.224以二进制表示法为11111111.11111111.11111111.11100000,变化是在最后一组,11100000便是224,以三个位(Bit)可表示2的3次方便是8个网络编码
  子网掩码二进制表示法可分几个网络
  255.255.255.011111111.11111111.11111111.000000001
  255.255.255.128
  11111111.11111111.11111111.100000002
  255.255.255.192
  11111111.11111111.11111111.110000004
  255.255.255.224
  11111111.11111111.11111111.111000008
  255.255.255.240
  11111111.11111111.11111111.1111000016
  255.255.255.248
  11111111.11111111.11111111.1111100032
  255.255.255.252
  11111111.11111111.11111111.1111110064
  以下使用255.255.255.224将C类地址203.67.10.0分成8组网络编码,各个网络编码及其广播IP地址及可使用之IP地址序号网络编码广播可使用之IP地址
  (1)203.67.10.0--203.67.10.31
  203.67.10.1--203.67.10.30
  (2)203.67.10.32--203.67.10.63
  203.67.10.33--203.67.10.62
  (3)203.67.10.64--203.67.10.95
  203.67.10.65--203.67.10.94
  (4)203.67.10.96--203.67.10.127
  203.67.10.97--203.67.10.126
  (5)203.67.10.128--203.67.10.159
  203.67.10.129--203.67.10.158
  (6)203.67.10.160--203.67.10.191
  203.67.10.161--203.67.10.190
  (7)203.67.10.192--203.67.10.223
  203.67.10.193--203.67.10.222
  (8)203.67.10.224--203.67.10.255
  203.67.10.225--203.67.10.254
  可验证所使用的IP地址是否如上表所示
  203.67.10.115--11001011.01000011.00001010.01110011
  255.255.255.224--11111111.11111111.11111111.11100000
  --------------------------------------------------------------
  203.67.10.96--11001011.01000011.00001010.01100000
  203.67.10.55--11001011.01000011.00001010.00110111
  255.255.255.224--11111111.11111111.11111111.11100000
  --------------------------------------------------------------
  203.67.10.32--11001011.01000011.00001010.00100000
  其它的子网掩码所分成的网络编码可自行以上述方法自行推演出来。
  1.5.3 子网的应用
  使用子网是要解决只有一组C类地址但需要数个网络编码的问题,并不是解决IP地址不够用的问题,因为使用子网反而能使用的IP地址会变少,子网通常是使用在跨地域的网络互联之中,两者之间使用路由器连线,同时也上Internet,但只申请到一组C 类IP地址,过路由又需不同的网络,所以此时就必须使用到子网,当然二网络间也可以远程桥接(Remote Bridge,字面翻译)连接,那便没有使用子网的问题。
  网关地址
  若要使两个完全不同的网络(异构网)连接在一起,一般使用网关,在Internet中两个网络也要通过一台称为网关的计算机实现互联。这台计算机能根据用户通信目标计算机的IP地址,决定是否将用户发出的信息送出本地网络,同时,它还将外界发送给属于本地网络计算机的信息接收过来,它是一个网络与另一个网络相联的通道。为了使TCP/IP协议能够寻址,该通道被赋予一个IP地址,这个IP地址称为网关地址。
  完美测试TCP/IP协议简介
  安装网络硬件和网络协议之后,我们一般要进行TCP/IP协议的测试工作,那么怎样测试才算是比较全面的测试呢?我们认为,全面的测试应包括局域网和互联网两个方面,因此应从局域网和互联网两个方面测试,以下是我们在实际工作中利用命令行测试TCP/IP配置的步骤:
  1、 单击“开始”/“运行”,输入CMD按回车,打开命令提示符窗口。
  2、 首先检查IP地址、子网掩码、默认网关、DNS服务器地址是否正确,输入命令ipconfig /all,按回车。此时显示了你的网络配置,观查是否正确。
  3、 输入ping 127.0.0.1,观查网卡是否能转发数据,如果出现“Request timed out”,表明配置差错或网络有问题。
  4、 Ping一个互联网地址,如ping 202.102.128.68,看是否有数据包传回,以验证与互联网的连接性。
  5、 Ping 一个局域网地址,观查与它的连通性。
  6、 用nslookup测试DNS解析是否正确,输入如nslookup www.ccidnet.com,查看是否能解析。
  如果你的计算机通过了全部测试,则说明网络正常,否则网络可能有不同程度的问题。在此不展开详述。不过,要注意,在使用 ping命令时,有些公司会在其主机设置丢弃ICMP数据包,造成你的ping命令无法正常返回数据包,不防换个网站试试。
  补充:
[编辑本段]TCP/IP 协议簇
  TCP/IP(Transmission Control Protocol/Internet Protocol)已成为一个事实上的工业
  标准。
  TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
  TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第
  三层(对应OSI的第四层)。
  TCP和IP是TCP/IP协议簇的中间两层,是整个协议簇的核心,起到了承上启下的作用。
  1、接口层
  TCP/IP的最低层是接口层,常见的接口层协议有:
  Ethernet 802.3、Token Ring 802.5、X.25、Frame reley、HDLC、PPP等。
  2、网络层
  网络层包括:IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol)
  控制报文协议、ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向
  地址转换协议。
  IP是网络层的核心,通过路由选择将下一跳IP封装后交给接口层。IP数据报是无连接服务
  。
  ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。
  Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。
  ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址。
  RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站和DHCP服务。
  3、传输层
  传输层协议主要是:传输控制协议TCP(Transmission Control Protocol)和用户数据报协
  议UDP(User Datagram rotocol)。
  TCP是面向连接的通信协议,通过三次握手建立连接,通讯时完成时要拆除连接,由于TCP
  是面向连接的所以只能用于点对点的通讯。
  TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠
  性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用
  以限制发送方的发送速度。
  UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要
  连接,所以可以实现广播发送。
  UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求
  在程序员编程验证。
  4、应用层
  应用层一般是面向用户的服务。如FTP、TELNET、DNS、SMTP、POP3。
  FTP(File Transmision Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口
  是20H,控制端口是21H。
  Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。
  DNS(Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换。
  SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中
  转。 
  POP3(Post Office Protocol 3)是邮局协议第3版本,用于接收邮件。
  数据格式:
  数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC地址及类型,帧尾是校验字)
  IP数据包:IP头部+TCP数据信息 (IP头包括源和目标主机IP地址、类型、生存期等)
  TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校
  验字等)
  TCP/IP的实现
  这是一个给予UDP协议的TCP/IP网络的C程序实现。客户端应用层发起会话层的socket调用,在到达远端后,服务器端应用程序屏幕输出字符串 Hello World
  第一步 创建文件名为server.c的文件,然后拷贝以下代码到此文件:
  #include <stdio.h>
  #include <string.h>
  #include <netdb.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #define MAXBUF 256
  main()
  {
  char buf[MAXBUF];
  int passiveSocket;
  socklen_t clientAddrLen;
  struct sockaddr_in serverAddr;
  struct sockaddr_in clientAddr;
  passiveSocket=socket(AF_INET,SOCK_DGRAM,0);
  memset(&serverAddr,0,sizeof(serverAddr));
  serverAddr.sin_family=AF_INET;
  serverAddr.sin_port=htons(1234);
  serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);/* serverAddr.sin_addr.s_addr = inet_addr(”127.0.0.1″); */
  if(bind (passiveSocket,(struct sockaddr *)&serverAddr,sizeof(serverAddr))==-1)
  printf (”bind Error!”);
  clientAddrLen=sizeof(serverAddr);
  memset(buf,0,MAXBUF);
  for(;;)
  {
  if(recvfrom(passiveSocket,buf,MAXBUF,0,(struct sockaddr *)&clientAddr,&clientAddrLen)>0)
  {
  printf(”Come from Client is : %s\n”, buf);
  memset (buf,0,sizeof(buf));
  }
  }
  }
  第二步 编译并运行server程序.在命令行下进入到server.c所在的文件夹,输入下列命令(黑体字为输入部分)
  [root@Linux test]#gcc -c server.c
  [root@Linux test]#gcc -o server server.o
  [root@website program]#./server
  第三步 完成以上步骤,server程序已经运行,这个窗口不要关,另开一个新窗口,输入
  [root@Linux test]# netstat -an | grep 1234
  udp 0 0 0.0.0.0:1234 0.0.0.0:*
  您会发现运行中的server程序已经被捆绑在udp的1234端口.
  第四步 创建文件名为client.c的文件,然后拷贝以下代码到此文件:
  #include <stdio.h>
  #include <string.h>
  #include <netdb.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  #define MAXBUF 256
  main()
  {
  char buf[MAXBUF]=”Hello World”;
  int activeSocket;
  struct sockaddr_in remoteAddr;
  struct sockaddr_in localAddr;
  struct hostent *hptr;
  activeSocket=socket(AF_INET,SOCK_DGRAM,0);
  memset(&remoteAddr,0,sizeof(remoteAddr));
  remoteAddr.sin_family=AF_INET;
  remoteAddr.sin_port=htons(1234);
  remoteAddr.sin_addr.s_addr=inet_addr(”127.0.0.1″);
  /*hptr=gethostbyname(”www.aorb.org”);
  memcpy((char*)&remoteAddr.sin_addr.s_addr,hptr->h_addr_list[0],hptr->h_length);*/
  printf(”Remote IP address is: %s…\n”,inet_ntoa(remoteAddr.sin_addr));
  sendto (activeSocket,buf,sizeof(buf),0,(struct sockaddr *)&remoteAddr,sizeof(remoteAddr));
  printf(”Send Success!\n”);
  memset (buf,0,sizeof(buf));
  close(activeSocket);
  }
  第五步 编译并运行client程序.打开一个新命令窗口,在命令行下进入到client.c所在的文件夹,输入下列命令:
  [root@Linux test]#gcc -c client.c
  [root@Linux test]#gcc -o client client.o
  [root@Linux test]#./client
  第六步 观察效果.现在点到server程序运行的窗口,看是不是出现了这样一句话
  Come from Client is : Hello World
  上面的Hello World这句话就是客户端client.c发来的.
  程序注释
  server.c
  #include <stdio.h>
  #include <string.h>
  #include <netdb.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  以上是加载头文件,头文件里定义了一些程序运行时需要的东东,不用管它.
  #define MAXBUF 256
  定义了常量MAXBUF的值256,下面会用到.当然您也可以不用定义,在后面的数组里直接写256这个数字也可以
  main()
  {
  char buf[MAXBUF];字符串数组buf的大小是256
  int passiveSocket;定义一个int类型的变量passiveSocket,它用来存储套接字描述符
  socklen_t clientAddrLen;定义一个socklen_t类型的变量clientAddrlen,用来接收客户端地址的长度
  struct sockaddr_in serverAddr;定义一个sockaddr_in类型的结构变量serverAddr,用来存储服务器端的IP地址,端口等信息
  struct sockaddr_in clientAddr;定义一个sockaddr_in类型的结构变量clientAddr,用来存储客户端的IP地址,端口等信息
  passiveSocket=socket(AF_INET,SOCK_DGRAM,0);socket函数需要传递3个值: 对于使用IPV4的网络接口,第1个参数必须是AF_INET.由于是UDP传输方式,第2个参数必须是SOCK_DGRAM.对于使用TCP或者UDP的传输,第3个参数都设置为0
  memset(&serverAddr,0,sizeof(serverAddr));初始化变量serverAddr,使其为数字0
  serverAddr.sin_family=AF_INET;把serverAddr结构中的sin_family变量赋值为AF_INET,这个值表示TCP/IP网络
  serverAddr.sin_port=htons(1234);把serverAddr结构中的sin_port变量赋值为1234,这个值代表服务器的接收端口为1234,您可以自行设置.htons函数是必须的,它把主机字节顺序转换为网络字节顺序
  serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);/* serverAddr.sin_addr.s_addr = inet_addr(”127.0.0.1″); */设置要绑定服务器的哪个IP地址.使用INADDR_ANY可以把服务器绑定在本机的所有IP地址.也可以使用inet_addr捆绑在特定端口.因为IP地址是32位的,所以需要使用htonl来转换网络字节顺序,而htons是用来转换2个字节16位的端口地址.
  if(bind (passiveSocket,(struct sockaddr *)&serverAddr,sizeof(serverAddr))==-1)
  printf (”bind Error!”);使用bind函数把刚才创建的套接字描述符passiveSocket与服务器套接字结构serverAddr捆绑在一起.
  clientAddrLen=sizeof(serverAddr);
  memset(buf,0,MAXBUF);初始化buf数组,设置为数字0
  for(;;)因为是服务器端程序,需要一直打开接收来自客户端的请求,所以必须创建一个死循环
  {
  if(recvfrom(passiveSocket,buf,MAXBUF,0,(struct sockaddr *)&clientAddr,&clientAddrLen)>0)利用recvfrom函数接收来自客户端的信息,并把信息存放在数组buf中.同时也把客户端的地址存放在了clientAddr中,方便信息的回送,本例服务器端为使用回送.
  {
  printf(”Come from Client is : %s\n”, buf);打印输出来buf中自客户端的信息
  memset (buf,0,sizeof(buf));清空buf
  }
  }
  }
  client.c
  #include <stdio.h>
  #include <string.h>
  #include <netdb.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
  以上是加载头文件,头文件里定义了一些程序运行时需要的数据.
  #define MAXBUF 256 定义了常量MAXBUF的值256,下面会用到.当然您也可以不用定义,在后面的数组里直接写256这个数字也可以
  main()
  {
  char buf[MAXBUF]=”Hello World”;给buf数组赋值为Hello World,这个字符串是后面要传送给服务器的信息.
  int activeSocket;定义一个整型变量activeSocket,它用来存储套接字描述符.
  struct sockaddr_in remoteAddr;同server.c中注释,设置Internet套接字地址结构变量remoteAddr
  struct sockaddr_in localAddr;同server.c中注释,设置Internet套接字地址结构变量localAddr
  struct hostent *hptr; 如果链接远程服务器使用URL的方式,则需定义此变量用来接收解析后的IP地址.
  activeSocket=socket(AF_INET,SOCK_DGRAM,0);同server.c中的注释,创建一个套接字结构,成功创建后把返回的套接字描述符存储在activeSocket
  memset(&remoteAddr,0,sizeof(remoteAddr));同server.c中的注释
  remoteAddr.sin_family=AF_INET;同server.c中注释
  remoteAddr.sin_port=htons(1234);设置远程服务器的端口地址
  remoteAddr.sin_addr.s_addr=inet_addr(”127.0.0.1″);设置远程服务器的IP地址,本例因为服务器和客户端在同一台机器上,所以使用同一个地址.
  /*hptr=gethostbyname(”www.aorb.org”);
  memcpy((char*)&remoteAddr.sin_addr.s_addr,hptr->h_addr_list[0],hptr->h_length);*/
  如果链接远程服务器使用URL,则需要用gethostbyname函数得到预解析URL的地址储存在hptr结构中,然后把hptr结构中的h_addr_list[0]值拷贝到套接字remoteAddr.sin_addr.s_addr变量. memcpy函数就是起到拷贝的作用.
  printf(”Remote IP address is: %s…\n”,inet_ntoa(remoteAddr.sin_addr));显示远程服务器的地址,这一步不是必须的.
  sendto (activeSocket,buf,sizeof(buf),0,(struct sockaddr *)&remoteAddr,sizeof(remoteAddr));发从存储在数组buf中的信息,也就是发送”Hello World”字符串到remoteAddr中指定的IP地址与端口.
  printf(”Send Success!\n”);如果sendto成功则显示Send Success!
  memset (buf,0,sizeof(buf));重置buf数组
  close(activeSocket);关闭activeSocket套接字释放内存.
  }
  程序原理
  在UNIX系统中,进程若对文件进行操作,一般使用open函数调用打开一个文件进行访问,每个进程都有一个文件描述符表,该表中存放了被进程打开的文件的索引(也称文件描述符),索引指出了文件在文件描述符表中的位置,这个索引值是一个指向操作系统文件表的指针.应用程序只要使用该描述符就可以对指定文件进行操作.类似的,每个打开的socket函数都对应一个整数,我们称它为socket描述符,该整数也是socket描述符在文件描述符表中的索引值.但socket描述符在描述符表中的表项并不指向文件表,而是指向一个与该socket有关的数据结构– socket结构.
  当程序用open函数打开一文件描述符,文件描述符指向一个文件表,而这个表指向文件在硬盘的具体位置.类似的,当程序用socket函数创建一个socket结构,但这个结构并不完整,需要使用send或者recvfrom等函数向socket结构填写其他部分,以指明预访问的目的地址或接收到的源地址.
相关数据
112次 被浏览次数
1次 编辑次数
|最新活动
|APP下载
下载电巢APP 随时随地看更多电巢视频
|专家解答
关注公众号与专家面对面