参考:http://www.52im.net/topic-tcpipvol1.html
1. 协议概述
- 网关:一个连接两种不同协议族的进程
- TCP/IP通常被认为是一个四层协议
- 应用层:应用程序/进程
- 运输层:TCP(传输控制协议)和UDP(用户数据报协议)
- 网络层:处理分组,IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)
- 链路层:设备驱动程序、网卡
- UDP:不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供
- TCP采用了超时重传、发送和接收端到端的确认分组等机制。
- 物理网络:以太网、令牌环网、点对点的链接和FDDI(光纤分布式数据接口)
- TCP/IP实现也允许一个多接口主机来担当路由器的功能,但是主机为此必须进行特殊的配置。
- 网桥是在链路层上,而路由器则是在网络层上对网络进行互连。
- TCP的应用:Telnet和Rlogin、FTP、SMTP
- UDP为应用:发送和接收数据报,DNS、TFTP:简单文件传送协议、BOOTP:引导程序协议、SNMP:简单网络管理协议
- 可以直接访问IP的应用程序
- ICMP是IP协议的附属协议,与其他主机或路由器交换错误报文和其他重要信息,Ping和Traceroute都使用了ICMP。
- IGMP是Internet组管理协议,用来把一个UDP数据报多播到多个主机
- ICMP和IGMP报文都被封装在IP数据报中
- ARP(地址解析协议)和RARP(逆地址解析协议)是网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。
- 点分十进制表示法(Dotted decimal notation),四个十进制的数,140.252.13.33
- InterNIC互联网络信息中心只分配网络号,主机号的分配由系统管理员来负责。注册服务(rs.internic.net),目录和数据库服务(ds.internic.net),以及信息服务(is.internic.net)组成InterNIC
- 三类IP地址:单播地址(目的为单个主机)、广播地址(目的端为给定网络上的所有主机)以及多播地址(目的端为同一组内的所有主机)
- 域名系统(DNS)是一个分布的数据库,由它来提供IP地址和主机名之间的映射信息
- 封装:
- TCP传给IP的数据单元称作TCP报文段或简称为TCP段(TCP segment),
- IP传给网络接口层的数据单元称作IP数据报(IP datagram) - 更准确的叫分组(packet),分组既可以是一个IP数据报,也可以是IP数据报的一个片(fragment)
- 通过以太网传输的比特流称作帧(Frame)
- 以太网数据帧(IP数据报)的物理特性是其长度必须在46~1500字节之间
- IP首部中加入8bit的某种标识(协议域),1表示为ICMP协议,2表示为IGMP协议,6表示为TCP协议,17表示为UDP协议
- 以太网的帧首部也有一个16 bit的(帧类型域),网络接口分别要发送和接收IP、ARP和RARP数据,因此也必须在以太网的帧首部中加入某种形式的标识,
- 分用(Demultiplexing):主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,检查报文首部中的协议标识,以确定接收数据的上层协议。
- 客户-服务器模型:
- 重复型:等待一个客户请求的到来=>处理客户请求(阻塞)=>发送响应给发送请求的客户=>等待
- 并发型:等待一个客户请求的到来=>启动一个新的服务程序来处理这个客户的请求(可能是进程、线程、协程),处理结束后,终止该服务程序=>等待
- 一般来说,TCP服务器是并发的,而UDP服务器是重复的
- 端口:TCP和UDP采用16 bit的端口号来识别应用程序,FTP(21)、Telnet(23)、TFTP(69),知名的1~1023之间的端口号
- 客户端口号又称作临时端口号(即存在时间很短暂),大于5000的端口号是为其他服务器预留的(Internet上并不常用的服务)
- /etc/services都包含了人们熟知的端口号
- 知名端口号(IANA)分配
- 查看端口号时,我们发现它们都是奇数,NCP(网络控制协议,TCP前身)是单工的,不是全双工的,因此每个应用程序需要两个连接,需预留一对奇数和偶数端口号。当TCP和UDP成为标准的运输层协议时,每个应用程序只需要一个端口号,因此就使用了NCP中的奇数。
- Internet技术标准化组织:
- 【协会】Internet协会(ISOC,Internet Society):推动、支持和促进Internet不断增长和发展的专业组织。
- 【委员会】Internet体系结构委员会(IAB,Internet Architecture Board)是一个技术监督和协调的机构,负责Internet标准的最后编辑和技术审核,隶属于ISOC。
- 【开发工程组】Internet工程专门小组(IETF,Internet Engineering Task Force)开发Internet标准规范,它分为9个领域(应用、寻径和寻址、安全等等),Internet工程指导小组(IESG, Internet Engineering Steering Group)用于协助IEFT
- 【实验室】Internet研究专门小组(IRIF,Internet Research Task Force),主要对长远的项目进行研究,IRTF和IETF都隶属于IAB
- Internet的正式标准都以RFC(Request for Comment)文档出版,另外,大量的RFC并不是正式的标准,出版的目的只是为了提供信息,数字越大说明RFC的内容越新
- 每种协议都有一个要求的层次、必需的、建议的、可选择的、限制使用的或者不推荐的。
- 重要的RFC文档:
- 1340:Internet端口号,每年至少更新一次
- 1600:各种Internet协议的标准化现状
- 1122:链路层、网络层和运输层
- 1123:应用层
- 1009、1993:路由器
- internet意思是用一个共同的协议族把多个网络连接(强调网络连接),Internet指的是世界范围内通过TCP/IP互相通信的所有主机集(强调世界范围主机通信),Internet是一个internet,但internet不等于Internet
- TCP/IP软件实现来自于位于伯克利的加利福尼亚大学的计算机系统研究小组,随同4.x BSD系统(Berkeley Software Distribution)的网络版一起发布的
- 两种应用编程接口(API)
- socket
- TLI(运输层接口:Transport Layer Interface)
2. 链路层 - MTU(最大传输单元)、ARP和RARP
- 以太网,是当今TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入(Carrier Sense, Multiple Access with Collision Detection)。它的速率为10 Mb/s,地址为48 bit。
- 802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络。802网络共有逻辑链路控制(LLC)
- 以太网和IEEE802封装标准
- 两者都采用48 bit(6字节)的目的地址和源地址(硬件地址)、CRC
- 源地址后的2个字节在两种帧格式中互不相同(802:指它后续数据的字节长度,不包括CRC检验码。以太网:类型字段定义了后续数据的类型)
- 定义的帧和以太网的帧都有最小长度要求,数据部分必须至少为38字节,而对于以太网,则要求最少要有46字节,必须在不足的空间插入填充(pad)字节。
- CRC字段用于帧内后续字节差错的循环冗余码检验(检验和)(它也被称为FCS或帧检验序列)
- SLIP:串行线路IP,是一种在串行线路上对IP数据报进行封装的简单形式,SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调制解调器接入Internet。
- 压缩的SLIP:串行线路的速率通常较低,引出CSLIP(即压缩SLIP)的新协议
- PPP,点对点协议修改了SLIP协议中的所有缺陷,最终PPP应该取代SLIP
- 建立、配置及测试数据链路的链路控制协议(LCP:Link Control Protocol)。它允许通信双方进行协商,以确定不同的选项。
- 针对不同网络层协议的网络控制协议(NCP:Network Control Protocol)体系,
- 环回接口(Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。
- A类网络号127就是为环回接口预留的
- 127.0.0.1分配给这个接口,并命名为localhost
- 传给环回接口的IP数据报不能在任何网络上出现
- 送给主机本身IP地址的IP数据报一般不出现在相应的网络上
- 环回接口可以被看作是网络层下面的另一个链路层,
- MTU:
- 以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节。
- 不同网络支持的MTU有所不同,比如超通道MTU可以达到65535字节
- netstat可以输出MTU
- 路径MTU:两台通信主机路径中的最小MTU,往返MTU可能不一致,取决于当时所选择的路由
- 如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。
- 往返交互响应时间超过100~200ms就被认为是不好的
- ARP(地址解析协议)和RARP(逆地址解析协议)。
- ARP为IP地址到对应的硬件地址之间提供动态映射(自动完成)
- RARP是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或X终端),它需要系统管理员进行手工设置
- ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。(20分钟)
- arp -a:显示、-d:删除、-s:增加
- 一个ftp网络服务连接过程:
- gethostbyname:host转IP地址,涉及DNS、/etc/hosts、
- FTP客户端请求TCP用得到的IP地址建立连接。
- TCP发送一个连接请求分段到远端的主机,即用上述IP地址发送一份IP数据报
- 如果目的主机在本地网络上(如以太网、令牌环网或点对点链接的另一端),那么IP数据报可以直接送到目的主机上。
- 如果目的主机在一个远程网络上,那么就通过IP选路函数来确定位于本地网络上的下一站路由器地址,并让它转发IP数据报。
- IP数据报都是被送到位于本地网络上的一台主机或路由器。假定是一个以太网,那么发送端主机必须把32bit的IP地址变换成48bit的以太网MAC地址。(ARP的功能)
- ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。(广播,“如果你是这个IP地址的拥有者,请回答你的硬件地址。”)
- 目的主机的ARP层收到这份广播报文后,识别出这是发送端在寻问它的IP地址,于是发送一个ARP应答(包含IP地址及对应的硬件地址)
- 收到ARP应答后,使ARP进行请求—应答交换的IP数据报现在就可以传送了,发送IP数据报到目的主机
- 委托ARP或ARP代理(Proxy ARP):如果ARP请求是从一个网络的主机发往另一个网络上的主机,连接这两个网络的路由器就可以回答该ARP请求,相当于目的主机的代理,把分组从其他主机转发给它。
- RARP(逆地址解析协议):
- 具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址;但是无盘机,如X终端或无盘工作站(从网络上引导,而不是从本地磁盘引导),则需要采用RARP方法来获得IP地址。
- 无盘系统的RARP实现过程是从接口卡上读取唯一的硬件MAC地址,然后发送一份RARP请求(一帧在网络上广播的数据),请求某个主机响应该无盘系统的IP地址(在RARP应答中,只包含系统的IP地址)
- ARP,RARP请求以广播方式传送,而RARP应答一般是单播(unicast)传送的。
- 无盘系统从RARP应答中收到它的IP地址后,它将发送TFTP请求来读取引导映象。
- 当网络上没有RARP服务器时,会采用超时退避间隔请求方式再发送RARP请求
- 作为用户进程的RARP服务器,配置/etc/ethers(在硬件层上提供多个RARP服务器)
3. 相关命令
3.1. tcpdump
- -e:硬件地址
- -n:打印出点分十进制的地址,而不是主机名
- -v:选项的tcpdump命令来查看主机sun上进行的分组交换
3.2. ifconfig
对网络接口进行配置和查询
3.3. netstat
这个命令打印出每个接口的MTU、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度。
- -i参数将打印出接口信息,
- -n参数则打印出IP地址
3.4. ping
- -s:定时发送ICMP回显请求
- -R:查看RR路由记录
4. IP:网际协议
4.1. 关键词
- TCP/IP协议族核心协议、以IP数据报格式传输、IP不可靠,由上层保障、无连接,信源、信宿,IP包后发可能先到
- IP包首,20字节(同TCP首部一致):
- 4bit版本、4bit首部长(60字节,当今已废)、8bitTOS(服务类型,通常不设置)、16bit总长度,超级MTU(65535)
- 8bit ttl、8bit 协议号、链路层分片、16bit校验和
- 4字节源、4字节目的地址
- 可选项
- 数据部分
- 网络字节序:大端,先左后右(高位在左 0bit,低位在右31bit) - TCP首部都以大端次序传输、小端机器需要转换成大端传输
- 超级MTU(65535)、主机要求不能接收超过576字节的数据报(TCP)
- 以太网的最小帧长为46字节、
- TTL减1(经过一个处理它的路由器)
- CRC32校验,对首部中每个16 bit进行二进制反码的求和,差错丢弃,由上层去发现丢失的数据报并进行重传
- IP路由选择、点到点或者发送给默认路由,IP在内存中有路由表
- 路由表:目的地址IP、下一跳IP、UG标志(是网络还是主机地址)、网络接口
- IP逐跳,不知完整路径(搜索路由表,寻找目的IP、寻找目的网络、寻找默认路由),主机不可达、网络不可达
- Unix系统主机可配成路由器,路由有转发功能
- 子网寻址、子网掩码
4.2. 概述细节
- IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输
- IP提供不可靠、无连接的数据报传送服务:
- 不可靠(unreliable):不保证IP数据报能成功地到达目的地(简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端;可靠性必须由上层来提供(如TCP))
- 无连接(connectionless):IP并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的,都是独立地进行路由选择,IP数据报可以不按发送顺序接收(可能先发的包,出现后到的情况)
- IP数据报格式:
- 网络字节序(IP数据报格式字段):
- 协议版本号是4,因此IP有时也称作IPv4
- 首部长度(当今已没有什么用处)
- 服务类型(TOS)字段(现在已被忽略)=3bit优先权子(已废)+4bitTOS子字段(最小、最大吞吐、最高可靠性、最小费用)+1bit未用位(置0)
- 总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。(以太网的最小帧长为46字节,IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。)
- 标识字段:标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1(分片和重组时候会用到)
- TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。(TTL的初始值由源主机设置,经过一个处理它的路由器,它的值就减去1)。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
- 协议字段:识别是哪个协议向IP传送数据
- 检验和码:首部和数据检验和码(差错处理,丢弃数据包,由上层发现,并重传)
- 源IP地址和目的IP地址
- 选项字段:以32 bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍
- IP路由选择:
- 目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。当今的大多数多用户系统,包括几乎所有的Unix系统,都可以配置成一个路由器。我们可以为它指定主机和路由器都可以使用的简单路由算法。本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。内含路由器功能的主机应该从不转发数据报,除非它被设置成那样。
- IP可以从TCP、UDP、ICMP和IGMP接收数据报(即在本地生成的数据报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。
- IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次。
- 当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果是发送给本IP或者被广播,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据报的目的不是这些地址,那么(1)如果IP层被设置为路由器的功能,那么就对数据报进行转发(也就是说,像下面对待发出的数据报一样处理);否则(2)数据报被丢弃。
- 路由表包含下面这些信息:
- 目的IP地址。(主机或网络地址),特定主机:主机号非0,广播:主机号为0
- 下一条路由器的IP,或者直接连接的网络IP地址
- 标志(一个指明目的IP是网络地址还是主机地址,另一个指明下一个路由是否是真正的路由)
- 网络接口
- IP路由选择:选择与目标IP地址完全匹配的表目、选择网络号匹配、选择默认路由,在选择路由时,主机路由优先于网络路由,最后在没有其他可选路由存在时才选择默认路由。
- 为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是IP路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模。
- 子网寻址:所有的主机都要求支持子网编址,不是把IP地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。(网络号、子网号、主机号)。这样做的原因是因为A类和B类地址为主机号分配了太多的空间,可分别容纳的主机数为2^24-2和2^16-2
- 有一个B类网络地址(140.252),在剩下的16 bit中,8bit用于子网号,8bit用于主机号,格式如图3-5所示。这样就允许有254个子网,每个子网可以有254台主机。
- 子网掩码:除了IP地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这是在引导过程中通过子网掩码来确定的。这个掩码是一个32 bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。
- IP主要存在三个方面的问题:IP耗尽、B类分配完、路由是扁平非层级,容易增大规模
- 无类别的域间路由选择CIDR(Classless Interdomain Routing)提出了一个可以解决第三个问题的建议,对当前版本的IP(IP版本4)进行扩充,
5. ICMP:Internet控制报文协议
- ICMP封装在IP数据报内部:ICMP经常被认为是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用,一些ICMP报文把差错报文返回给用户进程。
- ICMP的正式规范参见RFC 792[Posterl 1981b]
- ICMP报文结构
- ICMP报文的类型
- ICMP除了检测网络通路外,还可以获取时间、子网掩码、网络、主机、协议、端口等是否可达
- ICMP功能举例:
- 回显应答ping,
- ICMP时间戳请求允许系统向另一个系统查询当前的时间(请求—应答报文)
- ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码
- 时钟同步:
- ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time,UTC),提供了毫秒级的分辨率
- 严格的计时器使用网络时间协议(NTP),该协议在RFC 1305中给出了描述[Mills1992]。这个协议采用先进的技术来保证LAN或WAN上的一组系统的时钟误差在毫秒级以内。
- 分布式时间服务(DTS),它也提供计算机之间的时钟同步。
- 伯克利大学的Unix系统提供守护程序timed(8),来同步局域网上的系统时钟。不像NTP和DTS,timed不在广域网范围内工作。
- 由于ICMP覆盖的范围很广,从致命差错到信息差错,因此即使在一个给定的系统实现中,对每个ICMP报文的处理都是不相同的。最后一列标明是“内核”,那么ICMP就由内核来处理。如果最后一列指明是“用户进程”,那么报文就被传送到所有在内核中登记的用户进程,以读取收到的ICMP报文。如果不存在任何这样的用户进程,那么报文就悄悄地被丢弃(这些用户进程还会收到所有其他类型的ICMP报文的拷贝,虽然它们应该由内核来处理,当然用户进程只有在内核处理以后才能收到这些报文)。有一些报文完全被忽略。最后,如果最后一列标明的是引号内的一串字符,那么它就是对应的Unix差错。
6. ping程序
6.1. 关键词
- ping程序、ICMP报文标识符为ping的进程ID、ICMP也是基于IP,不用经过传输层(TCP/UDP),ping服务器在内核中实现ICMP的功能
- ping检测分支丢失、失序(ISN seq序号号顺序+1)、重复
- 往返time=当前时间-ICMP报文中时间
- 第一个ping较大原因,arp缓存问题
- IP路由记录RR(
ping -R
) - 应答内容大小限制(9个ip),利用traceroute
跟踪
6.2. 详细说明
- ping程序是对两个TCP/IP系统连通性进行测试的基本工具。它只利用ICMP回显请求和回显应答报文,而不用经过传输层(TCP/UDP)。Ping服务器一般在内核中实现ICMP的功能。
- “ping”这个名字源于声纳定位操作。目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答
- Ping程序还能测出到这台主机的往返时间,以表明该主机离我们有“多远”。
- 一台主机的可达性可能不只取决于IP层是否可达,还取决于使用何种协议以及端口号。Ping程序的运行结果可能显示某台主机不可达,但我们可以用Te lnet远程登录到该台主机的25号端口(邮件服务器)。
- ICMP回显请求和回显应答报文格式
- 标识符字段:发送进程的ID号
- 序列号:从0开始,每发送一次新的回显请求就加1,返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。
- 返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间(TTL位于IP首部中的生存时间字段)。
- 新版本的ping程序只发送一个回显请求。如果收到回显应答,则输出“host is alive”;否则,在20秒内没有收到应答就输出“no answer(没有回答)”
- 回显请求大约每隔1秒钟发送一次。
- 针对Ping的响应结果说明
- LAN输出:通常第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在ARP高速缓存中的缘故。第1个RTT中多出的时间很可能就是因为发送ARP请求和接收ARP应答所花费的时间
- WAN输出:比如序列号为1、2、3、4、6、10、11、12和13的回显请求或回显应答在某个地方丢失了。另外,我们注意到往返时间发生了很大的变化(像52%这样高的分组丢失率是不正常的。即使是在工作日的下午,对于Internet来说也是不正常的)。通过广域网还有可能看到重复的分组(即相同序列号的分组被打印两次或更多次),失序的分组(序列号为N+1的分组在序列号为N的分组之前被打印)。
- 拨号SLIP链路:很多因素都有可能影响,调制解调器带来了时延(调制解调器的参数对RTT的影响很大)
- 随着数据的压缩,分组长度可能会减小,但是由于使用了错误控制协议,分组长度又可能会增加。
- 接收端的调制解调器只能在验证了循环检验字符(检验和)后才能释放收到的数据。
- 我们还要处理每一端的计算机异步串行接口,许多操作系统只能在固定的时间间隔内,或者收到若干字符后才去读这些接口。
- ping程序为我们提供了查看IP记录路由(RR)选项的机会,
ping -R
,每个处理该数据报的路由器都把它的IP地址放入IPRR选项
字段中。当数据报到达目的端时,IP地址清单应该复制到ICMP回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当ping程序收到回显应答时,它就打印出这份IP地址清单。最大的问题是IP首部中只有有限的空间来存放IP地址(早期只能记录几个),现在更好的方式是通过Traceroute工具
来记录。 - 我们将看到traceroute程序可以提供一种更好的方法来计算路由器之间的跳站数。