理解tcpip[指南]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.了解TCP/IP
Internet是由上亿台计算机互联组成的,要能正确地访问每台机器、使数据在Internet中正确传播需要一个协议进行控制。
Internet使用的这一协议就是TCP/IP。
什么是TCP/IP 这是一组通信协议的代名词。
它本身指两个协议:TCP网络传输控制协议,IP网际协议。
IP(网间协议):Internet将消息从一个主机传递到另一个主机使用的协议称为网间协议(IP),这是Internet网络协议。
网间协议负责将消息发送到指定接收主机。
可以使用广域网或局域网,高速网或低速网,无线网或有线网等几乎所有类型的网络通信技术。
TCP(传输控制协议):消息在传送时被分割成一个个的小包,传输控制协议(TCP)负责收集这些信息包,并将其按适当的次序放好来发送,在接收端收到后再将其正确地还原。
传输控制协议处理了IP协议中没有处理的通信问题,向应用程序提供可靠的通信连接,能够自动适应网络的变化。
它保证数据包在传送中正确无误。
在Internet中,网间协议和传送协议配合工作,即我们常说的TCP/IP协议。
TCP/IP协议采用层次体系结构,从上而下分为应用层,传输层,网际层和数据链路层,每一层都实现特定的网络功能。
如图1(图1见TCP/IP分层模型.doc)所示。
数据链路层
数据链路层提供了TCP/IP与各种物理网络的接口。
物理网络指的是各种局域网和广域网,如Ethernet和X.25公共分组交换网等。
其还为网络层提供服务。
网际层
网际层解决了计算机与计算机之间的通信问题,这一层的通信协议统一为IP协议。
IP协议具有以下几个功能:
管理Internet地址:Internet上的计算机都要有唯一的地址,即IP地址。
路由选择功能:数据在传输过程中要由IP通过路由选择算法,在发送方和接送方之间选择一条最佳的路径。
数据的分片和重组:数据在传送过程中要经过多个网络,每个网络所规定的分组长度不一定相同。
因此,当数据经过分组长度较小的网络时,就要分割成更小的段。
当数据到达目的地后,还需要由IP进行重新组装。
●传输层
IP协议仅仅负责数据的传送,而不考虑传送的可靠性和数据的流量控制等安全因素。
传输层提供了可靠传输的方法。
传输层常用的协议是TCP(传输控制协议)和UDP(用户数据报协议)。
TCP提供了可靠传输的机制,它能够自动检测丢失的数据并自动重传,弥补IP协议的不足。
TCP和IP总是协调一致地工作,一确保数据的可靠传输。
●应用层
应用层提供了网络上计算机之间的各种应用服务,如Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、HTTP(超文本传输协议)和Gopher等。
几乎所有的应用程序都有自己的协议。
在网际上源主机的协议层与目的主机的同层协议通过下层提供的服务实现对话。
在源和目的主机的同层实体称为伙伴(peers),或叫对等进程。
它们之间的对话实际上是在源主机上从上到下然后穿越网络到达目的主机后在从下到上到达相应层。
下面以使用TCP协议传输文件(如FTP应用程序)为例说明TCP/IP 的工作原理:
在源主机上应用层将一串字节流传给传输层。
传输层将字节流分成TCP段,加上TCP包头交给网际(IP)层。
IP层生成一个包,将TCP段放入其数据域,并加上源和目的主机的IP地址。
将IP包交给数据链路层。
数据链路层在其帧的数据部分装IP包,发往目的主机或IP路由器处。
在目的主机,数据链路层将数据链路层帧头去掉,将IP包交给网际层。
IP层检查IP包头,如果包头中的检查和与计算出来的不一致,则丢该包。
如果检查一致,IP层去掉IP头,将TCP段交给TCP层,TCP层检查顺序号来判断是否为正确的TCP段。
TCP层为TCP包头计算TCP头和数据。
如果不对,TCP层丢弃这个包,若对,则向源主机发送确认。
在目的主机,TCP层去掉TCP头,将字节流传给应用程序。
于是目的主机收到了源主机发来的字节流,就象直接从源主机发来的一样。
实际上每往下一层,便多加了一个报头,而这个头对上层来说是透明的,上层根本不知道。
如图2所示(图2见在以太网上基于TCP/IP的FTP打包过程.doc)。
IP地址的表示形式
Internet和我们直接发生关系的既不是物理网,也不是网络协议,而是网络应用软件和应用程序。
它们是我们使用网络时必须借助的基本工具,是我们与
网络打交道的交互界面和入口。
这些网络应用程序与在单个计算机上运行的单用户应用程序不同,它离开网络使用将没有意义。
目前网络应用程序很多,如:Mail、telnet、ftp、archie、gopher、WAIS和WWW浏览器等。
要上网,就必须了解Internet 的地址和域名等基本常识。
Internet的地址就像我们身边的街道号码,用来标示网上计算机的“住址”。
Internet实际上是一个大型的TCP/IP网络,在Internet上进行信息交换的基本要求就是网上的所有主机必须具有唯一的地址,就象日常生活中朋友之间相互通信需要写明通信地址一样。
Internet地址分为两种形式:用数字表示的IP地址和用字母表示的域名地址。
在Internet上为每台主机指定的地址称为IP地址。
其是唯一的,具有固定、规范的格式。
每个IP地址含32位,被分为4段,每段8位,段与段之间用句点分隔。
为了便于表达和识别,IP地址是以十进制形式表示的,每段所能表示的十进制数最大不超过255。
IP地址由两部分组成,即网络号(NetgworkID)和主机号(HostID)。
网络号标识的是Internet上的一个子网,而主机号标识的是子网中的某台主机。
网际地址分解成两个域后,带来了一个重要的优点:IP数据包从网际上的一个网络到达另一个网络时,选择路径可以基于网络而不是主机。
在大型的网际中,这一点优势特别明显,因为路由表中只存储网络信息而不是主机信息,这样可以大大简化路由表。
IP地址根据网络号和主机号的数量而分为A、B、C三类:
A类IP地址:用7位来标识网络号,24位标识主机号,最前面一位为“0”,即A类地址的第一段取值介于1~126之间。
A类地址通常为大型网络而提供,全世界总共只有126个只可能的A类网络,每个A类网络最多可以连接16777214台主机。
B类IP地址:用14位来标识网络号,16位标识主机号,前面两位是“10”。
B类地址的第一段取值介于128~191之间,第一段和第二段合在一起表示网络号。
B类地址适用于中等规模的网络,全世界大约有16000个B类网络,每个B 类网络最多可以连接65534台主机。
C类IP地址:用21位来标识网络号,8位标识主机号,前面三位是“110”。
C类地址的第一段取值介于192~223之间,第一段、第二段、第三段合在一起表示网络号。
最后一段标识网络上的主机号。
C类地址适用于校园网等小型网络,每个C类网络最多可以有254台主机。
所有的IP地址都由国际组织NIC(NetworkInformationCenter)负责统一分配,目前全世界共有三个这样的网络信息中心:
InterNIC:负责美国及其他地区;
ENIC:负责欧洲地区;
APNIC:负责亚太地区。
我国申请IP地址要通过APNIC,APNIC的总部设在日本东京大学。
申请时要考虑申请哪一类IP地址,然后向国内的代理机构提出。
我们注意到前面讲的IP地址都是以数字形式表示主机的地址的,这种IP 地址人们记忆起来是非常困难的。
对非计算机和网络的专业人士来说,记住这种地址是很不现实的。
因此,Internet还采用域名地址来表示每台主机。
通过为每台主机建立IP地址与域名地址之间的映射关系,用户可以在网上避开难以记忆的IP地址,而用域名地址来唯一标记网上的计算机。
域名地址与IP地址的关系类似于一个人的姓名与身份证号码之间的关系。
要把计算机连入Internet,必须获得网上唯一的IP地址与对应的域名地址。
域名地址由域名系统(DNS)管理。
每个连到Internet的网络中都有至少一个DNS服务器,其中存有该网络中所有主机的域名和对应的IP地址,通过与其他网络的DNS服务器相连就可以找到其他站点。
这也就是在TCP/IP属性中要进行DNS配置的原因。
域名地址是分段表示的,每段分别授权给不同的机构管理,各段之间用圆点分隔。
与IP地址相反,各段自左至右越来越高。
Internet对某些通用性的域名作了规定。
例如,com是工商界域名,edu是教育界域名,gov是政府部门域名,等等目前共有14种如表1所示。
此外,国家和地区的域名常用两个字母表示。
例如,fr表示法国,jp表示日本,us表示美国,uk表示英国,cn表示中国,等等。
如果在一个域名的末尾没有找到地理域,就可以假定该域名是自美国的,其他国家的右边第一域名则代表国家。
表1
从用户的角度看,TCP/IP协议提供一组应用程序,主要包括:
1.远程登录协议(Telnet)
2.文件传输协议(Ftp)
3.电子邮件服务(Email)
4.Internet漫游服务(WWW服务)
5.简单邮件传输协议(SMTP)
6.信息服务(Gopher)
7.文件检索服务(Archie)
远程登录协议(Telnet)
用Telnet可以登录到远程服务器上并进行信息访问,可访问所有的数据库、联机游戏、对话服务以及电子公告牌,如同与被访问的计算机在同一房间中工作一样。
文件传输协议(Ftp)
运用FTP可以从网上得到许多应用程序和信息。
最初的FTP程序是工作在UNIX系统下的,而目前的许多FTP程序是工作在Window95下的,FTP程序除了完成文件的传送之外,还允许用户建立与远程计算机的连接,登录到远程主机上,并可在远程主机上的目录间移动。
●电子邮件服务(Email)
电子邮件是Internet提供的使用最广泛的服务。
通过电子邮件,可以与Internet上的任何人交换信息。
电子邮件的快速、高效、方便以及价廉,使得越来越多的人热衷于这项服务。
目前,全球平均每天约有几千万份电子邮件在网上传输。
Internet漫游服务(WWW服务)
实际上,现在大家使用最多的应该是WWW服务,它同其它Internet程序的最大区别就是它的界面对我们有很大的吸引力,通过WWW服务,只要用鼠标单击加亮的词或者短语,就可以到达世界上的任何地方。
由于WWW服务使用的是超文本链接,所以可以很方便的从一个信息
页转换到另一个信息页。
它不仅能查看文字,还可以欣赏图片、音乐、动画。
最流行的WWW服务的程序就是Navigator和IE了。
简单邮件传输协议(SMTP)
SMTP是TCP/IP协议族的一个成员,这种协议认为你的主机是永久连接在Internet上的,而且,认为你在网络上的主机在任何时候是可以被访问的。
所以,它适用于永久连接在Internet的主机,但是无法使用通过SLIP/PPP连接的用户接收电子邮件。
解决这个问题的办法是在邮件主机上同时运行SMTP和POP 协议的程序,SMTP负责邮件的发送和在邮件主机上的分拣和存储,POP协议负责将邮件通过SLIP/PPP连接传送到用户的主机上。
●信息服务(Gopher)
Gopher最早出现在1991年,它其实是第一个操作简便、使用广泛的从Internet服务器上获取信息的客户应用程序。
除了操作简便外,它的另一个特点是速度快。
Gopher运行时,将显示一个交互式的供用户选择的菜单,菜单中的选项由简单的短句组成,每个短句通常指向另一个菜单,并最终指向有用的文件。
Gopher是帮助用户在Internet信息海洋中搜索有用信息的导航器。
用户只要关心浏览的内容,而不必关心具体的服务器。
文件检索服务(Archie)
它是一种从整个Internet上匿名FTP服务器获取文件的服务。
其完全依赖于匿名FTP系统的管理员,他们将他们的站点对全世界的Archie服务器进行了注册。
Archie仅通过文件名进行检索。
二.tcp/ip的深入理解
TCP协议在能够发送数据之前就建立起了“连接”。
要实现这个连接,启动TCP连接的那一方首先将发送一个SYN数据包。
这只是一个不包含数据的数据包,然后,打开SYN标记。
如果另一方同时在它收到SYN标记的端口通话,它将发回一个SYN+ACK:SYN和ACK标志位都被打开,并将ACK(确认)编号字段设定为刚收到的那个数据包的顺序号字段的值。
接下来,连接发起方为了表示收到了这个
SYN+ACK信息,会向发送方发送一个最终的确认信息(ACK包)。
这种SYN、SYN+ACK、ACK的步骤被称为TCP连接建立时的“三次握手”。
在这之后,连接就建立起来了。
这个连接将一直保持活动状态,直到超时或者任何一方发出一个FIN(结束)信号。
任何一方都可以关闭一个TCP连接,要求双方发送一个FIN信号关闭自己的通讯频道。
一方可以在另一方之前关闭,或者双方同时关闭TCP连接。
因此,当一方发送一个FIN信号时,另一方可发送“FIN+ACK”,开始关闭自己一方的通信并且确认收到了第一个FIN信号。
发送第一个FIN信号的人接下来再发送一个“FIN+ACK”信息,确认收到第二个FIN信号。
另一方就知道这个连接已经关闭了,并且关闭了自己的连接。
发送第一个FIN的人没有办法收到最后一个ACK 信号的确认信息。
这时它会进入“TIME_WAIT”(等待时间)状态并启动一个定时器,防止另一方没有收到ACK信息并且认为连接仍是打开的。
一般来说,这个状态会持续1至2分钟。
现在,我们来讨论第一个问题。
如果有人(假如一个黑客)在你的Web服务器上留下一个半开或者半关的连接,那就是一个坏消息。
每一个连接都要消耗内存,打开数千个虚假的TCP连接可能导致服务器瘫痪。
当然,你实际上不可能在不影响TCP正常工作的情况下调整TCP定时器。
如果你听说过TCP SYN 攻击的话,那就是这个意思。
为了防止出现这种情况,大多数操作系统都要限制半开连接的数量。
例如,Linux默认的限制一般是256个。
关于持续流控制问题,现在我们就来讨论这个问题。
TCP中实现它的机制是TCP滑动窗口机制。
TCP协议使用“重新发送与正向ACK”来保证数据传输的可靠性。
发送方将等待一段时间,如果没有收到其发送的数据包的ACK确认信息,发送方就要重新发送。
顺便说一下,TCP协议中有许多定时器。
这只是其中一个定时器。
ACK的概念对于流控制是非常重要的,因为TCP滑动窗口协议使TCP的往复确认变得更有效率。
如果TCP要发送一个数据包并且等待每一个ACK确认信息,它实际上就把数据吞吐量削减了一半。
理想的情况是,我们能够一次发送许多数据包,然后等待收到一个确认收到全部数据包的ACK信息,而不用对方发来更多的数据。
但是,我们如何知道发送了多少个数据包呢?TCP窗口尺寸可以控制在“已发送但是没有确认”的状态下能够容纳多少个数据包。
如果这个窗口尺寸很大,我们不必等待ACK信息就可以发送大量的数据包。
这实际上就是流控制。
接收方就是控制窗口大小的那一方。
如果接收方将窗口大小设为“0”,那么,发送方根本就不能发送任何数据。
如果这个窗口的尺寸是“1”,那么,我们就回到了简单的“发送和等待ACK”的协议。
如果最后的窗口尺寸是“0”,发送者将发出一个探测信号以搞清这个窗口什么时间再次打开。
如果发送方从来没有收到ACK信息,它就一直不断地重试,直到定时器过期。
请记住,这个窗口尺寸在TCP头中是一个16位字段。
如果你要一个窗口尺寸(按字节计算)大于16位可以表示的容量(2的16次方个字节),还可以使用一个名为“窗口缩放”的
TCP协议选项。
这个选项允许窗口尺寸乘以比例因子。
如果没有极大的窗口尺寸,TCP协议就就无法充分利用GB级别的高速连接。
这也是我们需要针对这些新的高速连接调整TCP参数的原因,关于TCP流控制的问题,我们不能不提一下Nagle 算法。
如果我们在一个telnet连接上使用一个大的TCP窗口会发生什么事情呢?你会输入一个指令(例如敲了一个字母),然后一直等待回应它却迟迟不出现在终端回显上。
这对于实时通信来说是一个大问题。
而且,telnet也会增加网络的阻塞度,因为一个字节的数据(例如我们的一次击键)需要40个字节的包头。
于是RFC 896定义这个Nagle算法,用以消除小的数据包。
这个思路是我们应该在数据发送之前给先把小数据集中起来然后一次性发送,以便提高效率。
为了更有效率,它还限定只允许存在一个未经确认的数据段,你在得到确认信息之前不能发送更多的数据。
Telnet和互动SSH连接使用TCP_NODELAY套接口选项启用这个功能,这样当你按下一个按键的时候,你能够立即得到一个回应。
TCP协议非常善于解决流控制问题,因此非常适应于许多应用程序。
TCP协议中的流控制的含义是:“在收到对发送的数据的确认信息这前,我可以发送多少数据?”这就是TCP窗口。
学习阻塞控制的问题可以留作读者的练习。
需要指出的是,在TCP协议之下连接速度开始很慢,然后速度逐渐加快。
这个做法并不总是最理想的。