下图示意了TCP/IP 与 ISO OSI 参考模型之间的对应关系。
OSI体系结构
|
TCP/IP协议集
|
因特网的协议集称为TCP/IP协议集,协议集的取名表示了TCP和IP协议在整个协议集中的重要性。因特网协议集是对ISO/OSI的简化,其主要功能集中在OSI的第3-4层,通过增加软件模块来保证和已有系统的最大兼容性。
TCP/IP协议集的分层实施:
基于因特网的信息流示意图:
![](http://userimage1.360doc.com/07/0405/65/15870_20070405652370003.bmp)
IP协议
IP协议用来封装TCP和UDP消息段。IP为网络硬件提供了一个逻辑地址。这一逻辑地址是一个32位的地址,即IP地址,可以用来将由路由器连接在一起的各个物理网络区分开。IP协议所提供的逻辑IP地址还表示了数据发往的目的网络及在那一网络上的主机地址。这样它就可以用于将数据单元(称为“数据报”)引向正确的目的地。
![](http://userimage1.360doc.com/07/0611/15/15870_200706111504150508.bmp)
IP协议是因特网中的基础协议,由IP协议控制传输的协议单元称为IP数据报。IP协议屏蔽下层各种物理网络的差异,向上层(主要是TCP层或UDP层)提供统一的IP数据报。
IP协议提供不可靠的、 无连接的、尽力的数据报投递服务。
(1)不可靠的投递服务
IP协议无法保证数据报投递的结果。在传输过程中,IP数据报可能会丢失、重复传输、延迟、乱序,IP服务本身不关心这些结果,也不将结果通知收发双方。
当可靠性很重要时,IP必须与一个可靠的协议(如TCP)配合起来使用。
(2)无连接的投递服务
IP协议是一个无连接的协议,它无需为发送数据报建立虚电路。每一个IP数据报是独立处理和传输的,由一台主机发出的数据报,在网络中可能会经过不同的路径,到达接收方的顺序可能会乱,甚至其中一部分数据还会在传输过程中丢失。
(3)尽力的投递服务
尽最大努力的意思是IP不提供差错检测或跟踪。IP假定了底层是不可靠的,因此尽最大努力传输到目的地,但没有保证。 IP协议软件决不简单地丢弃数据报,只要有一线希望,就尽力向前投递。 IP协议软件执行数据报的分段,以适应具体的网络传输,数据报的合段则由最终结点的IP模块完成。
IPV4协议
目前因特网上广泛使用的IP协议为IPv4,IPv4协议的设计目标是提供无连接的数据报尽力投递服务。 在一个物理网络上传送的单元是一个包含首部和数据的帧,首部给出了诸如(物理)原网点和目的网点的地址。互联网则把它的基本传输单元叫做一个Internet数据报(datagram),有时称为IP数据报或仅称为数据报。像一个典型的物理网络帧一样,数据报被分为首部和数据区。而且,数据报首部也包含了原地址和目的地址以及一个表示数据报内容的类型字段。数据报与物理网络帧的区别在于:数据报首部包含的是IP地址,而帧的首部包含的是物理地址。下图显示了一个数据报的一般格式。
下图显示了在一个数据报中各字段的安排: ![]()
IP数据报的封装
IP数据报的寿命:
ICMP:Internet控制报文协议 ICMP在IP系统间传递差错和管理报文,是任何IP实现必须和要求的组成部分。可以把ICMP分成两类:差错和查询。查询报文是用一对请求和回答定义的。差错报文通常包含了引起错误的IP包的第一个分片的IP首部(和选项),加上该分片数据部分的前8个字节。 下图显示了所有目前定义的ICMP报文。双线上面的是请求和回答报文,双线下面的是差错报文。 PRC_栏显示了Net/3处理的与协议无关的差错码和ICMP报文之间的映射。对请求和回答,这一列是空的。因为在这种情况 下不会产生差错。如果对一个ICMP差错,这一行为空,说明Net/3不识别该码,并自动丢弃该差错报文。 1.icmp结构Net/3通过下图中的icmp结构访问某个ICMP报文。 icmp_type标识特定报文,icmp_code进一步制定报文。icmp_cksum的算法与IP首部检验和相同。 联合icmp_hun(首部联合)和icmp_dun(数据联合)按照icmp_type和icmp_code访问多种icmp报文。每个icmp报文都使用 icmphun;只有一部分报文使用icmp_dun。没有使用的字段必须设置为0. icmp报文时封装在IP数据报中的。 2.ICMP的protosw结构inetsw[4]的protosw结构描述了icmp,并支持内核和进程对协议的访问。下图显示了该结构。 ipintr对数据报进行分用是根据IP首部中的传输协议编号ip_p。对于ICMP报文,ip_p是1,通过ip_protox选择inetsw[4]。 3.输入处理:icmp_input函数当一个icmp报文到达时,IP层通过inetsw[4]的pr_input函数,间接调用icmp_input。 在icmp_input中,每一个ICMP报文被处理3次:被icmp_input处理一次;被与ICMP差错报文中的IP分组相关联的传输层协 议处理一次;被记录收到ICMP报文的进程处理一次。 ICMP输入处理过程的总的构成情况如下: 下面分五部分讨论icmp_input: 1.验证收到的报文 2.icmp差错报文 3.icmp请求报文 4.icmp重定向报文 5.icmp回答报文 函数大致流程如下: 判断icmp的报文长度,如果太短,就直接丢弃 ↓ icmp包结构中包含校验和字段,使用该字段检查icmp的校验和 ↓ 判断icmp的报文类型,如果能够识别,根据报文类型执行相应操作;如果无法识别,则直接执行raw操作rip_input ↓ 执行raw操作rip_input,rip_input根据报文里含有的协议及源站和目的地址信息,把报文发布给正在监听的进程。 3.1.差错报文处理当主机发出的数据报无法成功提交给目的主机时,目的主机或中间的路由器生成这些报文,并将它们返回到原来的系统。 下图显示了多种ICMP差错报文的格式: icmp_input将icmp_type和icmp_code映射到一个协议无关的差错集码上,该差错码是由PRC_常量表示的,且PRC_常量是有 顺序的。如下图所示: 然后icmp_input调用传输层协议的pr_ctlinput函数,该函数根据原始数据报的ip_p,把分组分用到正确的协议,从而构造 出原始的IP数据报。 3.2.请求处理Net/3响应具有正确格式的ICMP请求报文,把无效的ICMP请求报文传给rip_input。除路由器通告报文外,大多数Net/3所接收 的ICMP请求报文都生成回答报文。为避免回答报文分配新的mbuf,icmp_input把请求报文的缓存转成成回答缓存,并返回给 发送方。 3.2.1.回显询问:ICMP_ECHO和ICMP_ECHOREPLYping程序就是使用了回显询问请求。下图是ICMP回显请求和回答报文的结构。 icmp_code总是0,icmp_id和icmp_seq设置成请求的发送方,回答中也不做修改。源系统可以用这些字段匹配请求和回答。 icmpdata中到达的所有数据也被反射。 3.2.2.时间戳询问:ICMP_TSTAMP和ICMP_TSTAMPREPLYICMP时间报文如下图所示: 请求的发送方设置icmp_otime(发出请求的时间),icmp_rtime(收到请求的时间)和icmp_ttime(发出回答的时间)由回答 的发送方设置。所有时间都是从UTC午夜开始的毫秒数。如果时间值没有以标准单位记录,就把高位置位,与IP时间戳选项 一样。 3.2.3.地址掩码询问:ICMP_MASKREQ和ICMP_MASKREPLY该请求可以发现某个网络上使用的子网掩码。 除非系统被明确地配置成地址掩码的授权代理,否则,RFC1122禁止向其发送掩码回答。这样就避免系统与所有向它发送请求 的系统共享不正确的地址掩码。如果没有管理员授权回答,系统也要忽略地址掩码请求。 ICMP地址掩码请求和回答如下图所示:
3.2.4.信息查询:ICMP_IREQ和ICMP_IREQREPLYICMP信息报文已经过时。它们企图广播一个源和目的站地址字段的网络部分为全0的请求,使系统发现连接的IP网络的数量。响应该请求的主机将返回一个填好网络号的报文,主机还需要其他办法找到地址的主机部分。
3.2.5.路由器发现:ICMP_ROUTERADVERT和ICMP_ROUTESOLICITRFC1256定义了ICMP路由器发现报文,Net/3内核不直接处理这些报文,而由rip_input把它们传给一个用户级守护程序,由它 发送和响应这种报文。 3.3.重定向处理下图显示了ICMP重定向报文的格式。 重定向信息被传给rtredirect,由这个函数更新路由表。重定向的目的地址被传给pfctlinput,由它通告重定向的所有协议域,使 协议有机会把缓存的到目的站的路由作废。 3.4.回答处理内核从不处理任何ICMP回答报文,ICMP请求由进程产生,内核从不产生请求。所以内核把它接收的所有回答传给等待ICMP 报文的进程。内核直接将报文传给rip_input交给传输层进行处理。 3.5.输出处理 有几种方法产生外出的报文。IP调用icmp_error来产生和发送ICMP差错报文。icmp_reflect发送回答报文。同时,进程也可能 通过原始ICMP协议生成ICMP报文。下图显示了这些函数与ICMP外出处理之间的关系。 3.6.icmp_sysctl函数IP的icmp_sysctl函数只支持下图中列出的选项。系统管理员可以用sysctl程序修改该选项。 ARP协议还记得数据链路层的以太网的协议中,每一个数据包都有一个MAC地址头么?我们知道每一块以太网卡都有一个MAC地址,这个地址是唯一的,那么IP包是如何知道这个MAC地址的?这就是ARP协议的工作。 ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存),如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机,而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。 一个典型的arp缓存信息如下,在任意一个系统里面用“arp -a”命令:
Interface: 192.168.11.3 --- 0x2
都会得到这样的结果。
Internet Address Physical Address Type 192.168.11.1 00-0d-0b-43-a0-2f dynamic 192.168.11.2 00-01-4a-03-5b-ea dynamic
这样的高速缓存是有时限的,一般是20分钟(伯克利系统的衍生系统)。 TCP协议
TCP端口、连接与端点:
TCP/UDP应用程序端口号分配
TCP协议的窗口机制:
UDP协议
UDP熟知端口及插口地址:
![]()
|