TCP/IP协议简介
TCP/IP协议简介
什么是TCP/IP?
TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。它们分别是传输控制协议和互连网协议。这两个协议属于众多的TCP/IP 协议组中的一部分。
TCP/IP协议组中的协议保证Internet上数据的传输,提供了几乎现在上网所用到的所有服务。这些服务包括:电子邮件的传输 文件传输 新闻组的发布 访问万维网
在TCP/IP协议组分两种协议:网络层的协议 应用层的协议
网络层协议
网络层协议管理离散的计算机间的数据传输。这些协议用户注意不到,是在系统表层以下工作的。比如,IP协议为用户和远程计算机提供了信息包的传输方法。它是在许多信息的基础上工作的,比如说是机器的IP地址。在机器IP地址和其它信息的基础上,IP确保信息包能正确地到达目的机器。通过这一过程,IP和其它网络层的协议共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的IP。
应用层协议
相反地,应用层协议用户是可以看得到的。比如,文件传输协议(FTP)用户是看得到的。用户为了传输一个文件请求一个和其它计算机的连接,连接建立后,就开始传输文件。在传输时,用户和远程计算机的交换的一部分是能看到的。
请记住这句总结性的话:TCP/IP协议是指一组使得Internet上的机器相互通信比较方便的协议。
TCP/IP是如何工作的?
TCP/IP通过使用协议栈工作。这个栈是所有用来在两台机器间完成一个传输的所有协议的几个集合。(这也就是一个通路,数据通过它从一台机器到另一台机器。)栈分成层,与这里有关的是五个层。学习下面的图可以对层有个概念。
在数据通过图示的步骤后,它就从网络中的一台机器传到另一台机器了。在这个过程中,一个复杂的查错系统会在起始机器和目的机器中执行。
栈的每一层都能从相邻的层中接收或发送数据。每一层都与许多协议相联系。在栈的每一层,这些协议都在起作用。本章的下一部分将分析这些服务,以及它们在栈中是如何联系的。同时也分析一下它们的功能,它们提供的服务和与安全性的关系。
协议简介
已经知道数据是怎样使用TCP/IP协议栈来传输的了。现在仔细分析在栈中所用到的关键的协议。先从网络层的协议开始。
网络层协议
网络层协议是那些使传输透明化的协议。除了使用一些监视系统进程的工具外,用户是看不见这些协议的。
Sniffers是能看到这些步骤的装置。这个装置可以是软件,也可以是硬件,她能读取通过网络发送的每一个包。Sniffers广泛地用于隔离用户看不到的、网络性能下降的问题。sniffers能读取发生在网络层协议的任何活动。而且,正如你已经猜到的,sniffers会对安全问题造成威胁。参见Sniffers一章。
重要的网络层协议包括:
地址解析协议(ARP)
Internet控制消息协议(ICMP)
Internet协议(IP)
传输控制协议(TCP)
下面仅仅简单介绍一下。
地址解析协议ARP
地址解析协议的目的是将IP地址映射成物理地址。这在使信息通过网络时特别重要。在一个消息(或其他数据)发送之前,被打包到IP包里,或适合于Internet传输的信息块。这包括两台计算机的IP地址。在这个包离开发送计算机之前,必须要找到目标的硬件地址。这就是ARP最初用到的地方。
一个ARP请求消息在网上广播。请求由一个进程接收,它回复物理地址。这个回复消息由原先的那台发送广播消息计算机接收,从而传输过程就开始了。
ARP的设计包括一个缓存。为了理解缓存的概念,考虑一下:许多现代的HTML浏览器(比如Netscape或Microsoft的Internet
Explorer)使用了一个缓存。缓存是磁盘的一部分,从Web网上经常访问的东西就存在里面(比如按钮,或通用的图形)。这是符合逻辑的,因为当你返回这些主页的时候,这些东西不必再从远程计算机上装载了。从缓存中装载的速度要比较快。
相似的,ARP的实现包括一个缓存。以这种方式,网络或远程计算机的硬件地址就存着了,并为接着的ARP请求作准备。这样节省了时间和网络资源。
但是,正是由于缓存,就引起了安全性。
对于网络安全来将,这并不是最重要的安全性问题。然而,地址缓存(不仅仅是在ARP而且在其他例子中)确实会引起安全性问题。一旦这些地址保存,都会是让黑客伪造一个远程连接,它们对缓存的地址很欢迎。 Internet控制消息协议ICMP
Internet控制消息协议是用来在两台计算机间传输时处理错误和控制消息的。它允许这些主机共享信息。在这一方面,ICMP是用来诊断网络问题的重要工具。通过ICMP收集诊断信息的例子如下:
一台主机关机
一个网关堵塞和工作不正常
网络中其他的失败
可能最著名的ICMP实现的网络工具是ping。ping通常用来判断是否一台远程机器正开着,数据包从用户的计算机发到远程计算机。这些包通常返回用户的计算机。如果没有返回数据包到用户计算机,ping程序就产生一个表示远程计算机关机的错误消息。
应用层协议
应用层协议是专门为用户提供应用服务的。它是建立在网络层协议之上的。
Telnet
Telnet在RFC
854中有详细地描述,Telnet协议中说明:Telnet协议的目的就是提供一个相当通用的,双向的,面向八位字节的通信机制。它的最初目的是允许终端和面向终端的进程之间的交互。
Telnet不仅允许用户登录到一个远程主机,它允许用户在那台计算机上执行命令。这样,Los Angeles的一个人可以Telnet到New
York的一台机器,并在这台机器上运行程序,就跟在New York的用户一样。
对于熟悉Telnet的用户来讲,他的操作与BBS的界面一样。Telnet是一个能提供建立在终端字体的访问数据库的一个应用程序。比如,多于80%的大学的图书馆的目录可以通过Telnet访问到。
即使GUI应用程序被大大采用,Telnet这个建立在字符基础上的应用程序,仍相当的流行。这有许多原因。第一,Telnet允许你以很小的网络资源花费实现各种功能(如收发邮件)。实现安全的Telnet是件十分简单的事。有许多这样的程序,通用的是Secure Shell。
要使用Telnet,用户要指定启动Telnet客户的命令,并在后面指定目标主机的名字。在Linux中,可以这样:
$telnet internic.net
这个命令启动Telnet过程,连接到internic.net。这个连接可能被接受,或被拒绝,这与目标主机的配置有关。在UNIX,Telnet命令很久以前就是内置的。也就是说,Telnet已经包含在UNIX的发行版本中有十年了。但并不是所有操作系统都将Telnet作为内置的Telnet客户。
文件传输协议FTP
文件传输协议是从一个系统向另一个系统传递文件的标准方法。它的目标在RFC 0765中写得很清楚。
FTP的目标是1)促进文件和程序的共享,2)鼓励间接和含蓄的使用远程计算机,3)使用户不必面对主机间使用的不同的文件存储系统,4)有效和可靠地传输文件。FTP,尽管用户可以直接通过终端来使用,是设计成让别的程序使用的。
约有二十年,研究者调查了相当广泛的文件传输方法。FTP经历了多次改变。1971年作了第一次定义,整个的说名参见RFC 114。
FTP是怎样工作的?
FTP文件传输应用在客户/服务环境。请求机器启动一个FTP客户端软件。这就给目标文件服务器发出了一个请求。典型地,这个要求被送到端口21。一个连接建立起来后,目标文件服务器必须运行一个FTP服务软件。
FTPD是标准的FTP服务daemon。它的功能很简单:回复inetd收到的连接请求,并满足这些要传输文件的请求。这个daemon在许多发行版的UNIX中是个标准。
FTPD等待一个连接请求。当这样的一个请求到达时,FTPD请求用户登录。用户提供它的合法的登录名和口令或匿名登录。
一旦登录成功,用户可以下载文件了。在某些情况下,如果服务器的安全允许,用户可以上载文件。
简单邮件传输协议SMTP
简单邮件传输协议的目的是使得邮件传输可靠和高效。
SMTP是一个相当小和有效的协议。用户给SMTP服务器发个请求。一个双向的连接随后就建立了。客户发一个MAIL指令,指示它想给Internet上的某处的一个收件人发个信。如果SMTP允许这个操作,一个肯定的确认发回客户机。随后,会话开始。客户可能告知收件人的名称和IP地址,以及要发送的消息。
尽管SMTP相当简单,邮件服务是无穷的安全漏洞的源泉。
SMTP服务在Linux内部是内置的。其它网络操作系统也提供某些形式的SMTP。
Gopher
Gopher是一个分布式的文件获取系统。它最初是作为Campus Wide Information
System在Minnesota大学实现的。它的定义如下:
Internet
Gopher协议最初是设计用来最为一个分布式文件发送系统的。文档放在许多服务器上,Gopher客户软件给客户提供一个层次项和目录,看上去象一个文件系统。事实上,Gopher的界面设计成类似一个文件系统,因为文件系统是查找文件和服务的最好模型。
Gopher服务功能相当强大。能提供文本,声音,和其他媒体。主要用在文本模式,比通过用浏览器使用HTTP要来得快。毫无疑问,最流行的Gopher客户软件是为UNIX编写的。其他操作系统也有Gopher客户端软件。
典型地,用户启动一个Gopher客户端软件,和一个Gopher服务器。随后,Gopher返回一个可以选择的菜单。可能包括查找菜单,预先设置的目标,或文件目录。
注意,Gopher模式完全是一个客户服务器模式。用户每次登录,客户给Gopher服务器发送一个请求,要求所有能得到的文档。Gopher服务器对这个信息做出反应知道用户请求一个对象。
超联结传输协议HTTP
由于它能让用户在网上冲浪,超联结传输协议可能是最有名的协议。HTTP是一个应用层协议,它很小也很有效,符合发布、合成和超媒体文本系统的的需要。是一个通用的,面向对象的协议,通过扩展请求命令,可以用来实现许多任务。HTTP的一个特点是数据表现的类型允许系统相对独立于数据的传输。
HTTP的出现永久地改变了Internet的特点,主要是使Internet大众化。在某些程度上,他它的操作与Gopher相类似。比如,它的工作是请求/响应式的。这是相当重要的一点。其他应用程序,比如Telnet仍需要用户登录(当他们登录时,便消耗系统资源)。但Gopher和HTTP协议,消除了这一现象。用户(客户)仅仅在他们请求或接受数据时消耗资源。
使用通用浏览器,象Netscape Navigator或Microsoft Internet
Explore,可以监视这一过程的发生。在WWW上的数据,你的浏览器会和服务器及时联系。这样,它首先获取文本,然后是图形,再后是声音,等等。在你的浏览器的状态栏的左下角。当它装载页面时,看着它几分钟。你会看到请求和服务活动的发生,通常速度很快。
HTTP并不特别关注所需的是什么类型的数据。各种形式的媒体都能插进,以及远程的HTML主页。
网络新闻传输协议NNTP
网络新闻传输协议是一个广泛使用的协议。它提供通常作为USENET新闻组的新闻服务。
NNTP定义了一个协议,使用一个可靠的建立在流的基础上的在Internet上传输新闻的分发,询问,获取和发布的一个协议。NNTP被设计成新闻被存储在一个中心的数据库,允许订阅者选择他们希望读的主题。目录,交叉引用和过期的新闻都能找到。
NNTP有许多特性和简单邮件传输协议以及TCP相似。与SMTP相似,它接受一般的英语命令。和TCP相似,它是建立在流的传输和分发的基础上的。NNTP通常在端口119运行。
下面详细地讲解一下以太网,IP协议和TCP协议。
第二节 Etherner
以太网的基本工作原理
以太网上的所有设备都连在以太总线上,它们共享同一个通信通道。以太网采用的是广播方式的通信,即所有的设备都接收每一个信息包。网络上的设备通常将接收到的所有包都传给主机界面,在这儿选择计算机要接收的信息,并将其他的过滤掉。以太网是最有效传递的意思是,硬件并不给发送者提供有关信息已收到的信息。比如,即使目标计算机碰巧关机了,送给它的包自然就丢失,但发送者并不会知道这一点。
以太网的控制是分布式的。以太网的存取方式叫做带有Collision的Carrier Sense Multipe
Access。因为多台计算机可以同时使用以太网,每台机器看看是否有载波信号出现判定总线是否空闲。如果主机接口有数据要传输,它就侦听,看看是否有信号正在传输。如果没有探测到,它就开始传输。每次传输都在一定的时间间隔内,即传输的包有固定的大小。而且,硬件还必须在两次传输之间,观察一个最小的空闲时间,也就是说,没有一对机器可以不给其他计算机通信的机会而使用总线。
冲突侦测和恢复
当开始一个传输时,信号并不能同时到达网络的所有地方。传输速度实际上是光速的80%。这就有可能两个设备同时探测到网络是空闲的,并都开始传输。但当这两个电信号在网络上相遇时,它们都不再可用了。这种情况叫做冲突。
以太网在处理这种情况时,很有技巧性。每台设备在它传输信号的时候都监视总线,看看它在传输的时候是否有别的信号的干扰。这种监视叫做冲突侦听。在探测到冲突后,设备就停止传输。有可能网络会因为所有的设备都忙于尝试传输数据而每次都产生冲突。
为了避免这种情况,以太网使用一个2进制指数后退策略。发送者在第一次冲突后等待一个随机时间,如果第二次还是冲突,等待时间延长一倍。第三次则再延长一倍。通过这种策略,即使两台设备第二的等待时间会很接近,但由于后面的等待时间成指数倍增长,不就,他们就不会相互冲突了。
以太网的硬件地址
每台连接到以太网上的计算机都有一个唯一的48位以太网地址。以太网卡厂商都从一个机构购得一段地址,在生产时,给每个卡一个唯一的地址。通常,这个地址是固化在卡上的。这个地址又叫做物理地址。
当一个数据帧到达时,硬件会对这些数据进行过滤,根据帧结构中的目的地址,将属于发送到本设备的数据传输给操作系统,忽略其他任何数据。
一个是地址位全为1的时表示这个数据是给所有总线上的设备的。
以太网的帧结构
以太网的帧的长度是可变的,但都大于64字节,小于1518字节。在一个包交换网络中,每个以太网的帧包含一个指明目标地址的域。上图是以太网帧的格式,包含了目标和源的物理地址。为了识别目标和源,以太网帧的前面是一些前导字节,类型和数据域以及冗余校验。前导由64个0和1交替的位组成,用于接收同步。32位的CRC校验用来检测传输错误。在发送前,将数据用CRC进行运算,将结果放在CRC域。接收到数据后,将数据做CRC运算后,将结果和CRC域中的数据相比较。如果不一致,那么传输过程中有错误。
帧类型域是一个16位的整数,用来指示传输的数据的类型。当一个帧到达台设备后,操作系统通过帧类型来决定使用哪个软件模块。从而允许在同一台计算机上同时运行多个协议。
第三节 Internet地址
网络上的每一台计算机都有一个表明自己唯一身份的地址。TCP/IP协议对这个地址做了规定。一个IP地址由一个32位的整数表示。它的一个较为聪明的地方是很好的规定了地址的范围和格式,从而使地址寻址和路由选择都很方便。一个IP地址是对一个网络和它上面的主机的地址一块编码而形成的一个唯一的地址。
在同一个物理网络上的主机的地址都有一个相同前缀,即IP地址分成两个部分:(netid,hostid)。其中netid代表网络地址,hostid代表这个网络上的主机地址,根据他们选择的位数的不同,可以分成以下五类基本IP地址。
通过地址的前3位,就能区分出地址是属于A,B或C类。其中A类地址的主机容量有16777216台主机,B类地址可以有65536台主机,C类地址可以有256台主机。
将地址分成网络和主机部分,在路由寻址时非常有用,大大提高了网络的速度。路由器就是通过IP地址的netid部分来决定是否发送和将一个数据包发送到什么地方。
一个设备并不只能有一个地址。比如一个连到两个物理网络上的路由器,它就有两个IP地址。所以可以将IP地址看成是一个网络连接。
为了便于记忆和使用32位的IP地址,可以将地址使用用小数点分开的四位整数来表示。下面举个例子:
IP地址: 10000000 00001010 00000010 00011110
记为: 128.10.2.30
第四节 IP协议和路由
IP协议
IP协议定义了一种高效、不可靠和无连接的传输方式。由于传输没有得到确认,所以是不可靠的。一个包可能丢失了,或看不见了,或是延时了,或是传输顺序错了。但是传输设备并不检测这些情况,也不通知通信双方。无连接
因为每个包的传递与别的包是相互独立的。同一个机器上的包可能通过不同的路径到达另一台机器,或在别的机器上时已经丢失。由于传输设备都试图以最快的速度传输,所以是最高效的。
IP协议定义了通过TCP/IP网络传输的数据的格式,定义了数据进行传递的路由功能。
IP数据包的格式如下:
由一个头和数据部分组成。数据包的头部分包含诸如目的地址和源地址,数据的类型等信息。
数据包头格式:
数据包是由软件处理的,它的内容和格式并不是由硬件所限定。
比如,头4位是一个VERS,表示的是使用的IP协议的版本号。它表示发送者、接收者和路由器对该数据的处理都要按所示的版本进行处理。现在的版本号是4。软件通过版本来决定怎样进行处理。
头长度(HLEN)也是用4位来表示以32位为计量单位的头的长度。
TOTAL LENGTH表示这个数据包的长度(字节数)。从而包中的数据的长度就可以通过上面两个数据而计算出来了。
一般来说,数据部分就是一个物理的帧。对于以太网来讲,就是将整个的一个以太网的帧数据作为一个IP数据包的数据来传输的。
数据包的头里面还包含了一些其他的信息,请参见有关资料的具体介绍。 IP路由
在一个网络上,连接两种基本设备,主机和路由器。路由器通常连接几个物理网络。对一台主机来讲,要将一个数据包发往别的网络,就需要知道这个数据包应该走什么路径,才能到达目的地。对于一台路由器来讲,将收到的数据包发往哪个物理网络。因此,无论主机还是路由器,在发送数据包是都要做路由选择。
数据发送有两种方式:直接数据发送和间接数据发送。
直接数据发送通常是在同一个物理网络里进行的。当一个主机或路由器要将数据包发送到同一物理网络上的主机上时,是采用这种方式的。首先判断IP数据包中的目的地址中的网络地址部分,如果是在同一个物理网络上,则通过地址分析,将该IP目的地址转换成物理地址,并将数据解开,和该地址合成一个物理传输帧,通过局域网将数据发出。
间接数据发送是在不同物理网络里进行的。当一个主机或路由器发现要发送的数据包不在同一个物理网络上时,这台设备就先在路由表中查找路由,将数据发往路由中指定的下一个路由器。这样一直向外传送数据,到最后,肯定有一个路由器发现数据要发往同一个物理网络,于是,再用直接数据发送方式,将数据发到目的主机上。
主机和路由器在决定数据怎样发送的时候,都要去查找路由。一般,都将路由组成一个路由表存在机器中。路由表一般采用Next-Hop格式,即(N,R)对。N是目标地址的网络地址,R是传输路径中的下一个路由。通常这个路由和这台机器在同一物理网络里。
第五节 TCP协议
TCP传输原理
TCP协议在IP协议之上。与IP协议提供不可靠传输服务不同的是,TCP协议为其上的应用层提供了一种可靠传输服务。这种服务的特点是:可靠、全双工、流式和无结构传输。
它是怎样实现可靠传输的呢?
TCP协议使用了一个叫积极确认和重发送(positive acknowledgement with retransmission)的技术来实现这一点的。
接收者在收到发送者发送的数据后,必须发送一个相应的确认(ACK)消息,表示它已经收到了数据。
发送者保存发送的数据的记录,在发送下一个数据之前,等待这个数据的确认消息。在它发送这个数据的同时,还启动了一个记时器。如果在一定时间之内,没有接收到确认消息,就认为是这个数据在传送时丢失了,接着,就会重新发送这个数据。
这种方法还产生了一个问题,就是包的重复。如果网络传输速度比较低,等到等待时间结束后,确认消息才返回到发送者,那么,由于发送者采用的发送方法,就会出现重复的数据了。解决的一个办法是给每个数据一个序列号,并需要发送者记住哪个序列号的数据已经确认了。为了防止由于延时或重复确认,规定确认消息里也要包含确认序列号。从而发送者就能知道哪个包已经确认了。 TCP协议中还有一个重要的概念:滑动窗口。这一方法的使用,使得传输更加高效。
有前面的描述可见,发送者在发送完一个数据包之后,要等待确认。在它收到确认消息之前的这段时间是空闲的。如果网络延时比较长,这个问题会相当明显。
滑动窗口方法是在它收到确认消息以前,发送多个数据包。可以想象成有一个窗口在一个序列上移动。
如果一个包发送出去之后还没有确认,叫做未确认包。通常未确认的包的个数就是窗口的大小。
此窗口的大小为8。发送者允许在接收到一个确认消息以前发送8个数据包。当发送者接到窗口中第一个包的确认消息时,它就将窗口下滑一个。
在接收端,也有一个滑动窗口接收和确认一个包。
端口
使用TCP传输就是建立一个连接。在TCP传输中一个连接有两个端点组成。其实,一个连接代表的是发送和接收两端应用程序的之间的一个通信。可以把他们想象成建立了一个电路。通常一个连接用下面的公式表示:
(host,port)
host是主机,port是端口。TCP端口能被几个应用程序共享。对于程序员来讲,可以这样理解:一个应用程序可以为不同的连接提供服务。
TCP格式
TCP传输的单位是段,在建立连接,传送数据,确认消息和告之窗口大小时均要进行段的交换。
段的格式如下图:
段的格式也分成两部分,头和数据。
上面格式中的名称已经足够说明了他们的作用了。具体的含义请参见有关资料。
建立一个TCP连接
TCP协议使用一个三次握手来建立一个TCP连接的。
握手过程的第一个段的代码位设置为SYN,序列号为x,表示开始一次握手。接收方收到这个段后,向发送者回发一个段。代码位设置为SYN和ACK,序列号设置为y,确认序列号设置为x+1。发送者在受到这个段后,知道就可以进行TCP数据发送了,于是,它又向接收者发送一个ACK段,表示,双方的连接已经建立。
在完成握手之后,就开始正式的数据传输了。
上面握手段中的序列号都是随机产生的。
TCP/IP
每种网络协议都有自己的优点,但是只有TCP/IP允许与Internet完全的连接。TCP/IP是在60年代由麻省理工学院和一些商业组织为美国国防部开发的,即便遭到核攻击而破坏了大部分网络,TCP/IP仍然能够维持有效的通信。ARPANET就是由基于协议开发的,并发展成为作为科学家和工程师交流媒体的Internet。
TCP/IP同时具备了可扩展性和可靠性的需求。不幸的是牺牲了速度和效率(可是:TCP/IP的开发受到了政府的资助)。
Internet公用化以后,人们开始发现全球网的强大功能。Internet的普遍性是TCP/IP至今仍然使用的原因。常常在没有意识到的情况下,用户就在自己的PC上安装了TCP/IP栈,从而使该网络协议在全球应用最广。
TCP/IP的32位寻址功能方案不足以支持即将加入Internet的主机和网络数。因而可能代替当前实现的标准是IPv6