1、目录 一、 简要历史 3 二、 TCP/IP协议族 3 2.1. 简介 3 2.2. 编址 3 2.2.1 物理地址 3 2.2.2 逻辑地址 4 2.2.3 端口地址 5 2.3. 分层数据包介绍 5 2.3.1 以太网帧 5 2.3.2 ARP报文格式 6 2.3.3 IP数据报格式 6 2.3.4 ICMP报文格式 7 2.3.5 IGMP报文格式 9 2.3.6 UDP用户数据报首部格式 9 2.3.7 TCP报文段格式 10 2.4. 分层协议讲解 11 2.4.1 ARP和RARP 12 2.4.2 IP协议 13 2.4.3 ICMP协议 1
2、3 2.4.4 网际组管理协议(IGMP) 16 2.4.5 用户数据报(UDP) 17 2.4.6 传输控制协议(TCP) 18 三、 UIP处理流程 20 3.1. 简介 20 3.2. 层次结构 20 3.2.1 实现设备驱动与UIP对接需要的7个接口程序,定义在uip.h: 21 3.2.2 应用层要调用的函数,包括一些宏定义与函数,定义在uip.h: 24 3.2.3 UIP中所用到的主要结构体 27 3.2.4 uip的初始化与配置函数 31 3.2.5 Uip的主程序循环 32 3.2.6 主要的处理函数uip_process() 34 3.2.7 再来
3、分析UIP_UDP_SEND_CONN,主要处理UDP报文的发送: 37 3.2.8 接下来,分析UIP_POLL_REQUEST 38 3.2.9 对定时器期满的处理流程UIP_TIMER 40 3.2.10 对UIP_UDP_TIMER的处理流程 41 3.2.11 原始套接字和原始线程 41 一、 简明历史 1973年,ARPANET关键组组员Vint Cerf 和 Bob Kahn 发表了一篇里程碑论文,叙述了实现分组端到端交付协议。这篇相关传输控制协议(TCP)论文包含:封装、数据报,和网关功效。 以后,TCP被
4、划分为两个协议:传输控制协议(TCP)和网际互联协议(IP)。IP处理数据报路由选择,而TCP负责高层部分功效,如分段、重装和差错检测。这个用来进行网际互联协议以后就被称为TCP/IP。 二、 TCP/IP协议族 2.1. 介绍 TCP/IP协议族由5层组成:物理层、数据链路层、网络层、运输层和应用层。前四层和OSI模型前四层相对应,提供物理标准、网络接口、网际互联、和运输功效。而应用层和OSI模型中最高三层相对应。 TCP/IP协议族中各层包含了部分相对独立协议。在物理层和数据链路层,TCP/IP并没有定义任何协议。在网络层TCP/IP支持网际互联协议(IP),而IP又由四个支撑协议
5、组成:ARP、RARP、ICMP和IGMP。在传统上,TCP/IP协议族在运输层有两个运输协议:TCP和UDP,然而现在已经设计出一个新运输层协议SCTP以满足新应用需要。IP是主机到主机协议,即把分组从一个物理设备交付到另一个物理设备。UDP和TCP是运输机协议,负责把报文从一个进程(运行着程序)交付到另一个进程。 2.2. 编址 使用TCP/IP协议互联网使用3个等级地址:物理(链路)地址、逻辑(IP)地址和端口地址。每一个地址属于TCP/IP体系结构中特定层。 1 2 2.1 2.2 2.2.1 物理地址 物理地址也叫链路地址,是结点地址,由它所在局域网或广域网定义。物理
6、地址包含在数据链路层使用帧中。 以太网地址是6字节(48位)长,通常见十六进制记法,如:07:01:02:01:2C:4B。以太网地址共3种:单播、多播和广播。在单播地址中第一个字节最低位0;在多播地址中第一个字节最低位是1。广播地址是48个1。 2.2.2 逻辑地址 因特网逻辑地址是32位地址,能够用来标志连接在因特网上每个主机。在因特网上没有两个主机有相同IP地址。一样,逻辑地址也能够是单播地址、多播地址和广播地址。 Internet被多种路由器和网关设备分隔成很多网段,为了标识不一样网段,需要把32位IP地址划分成网络号和主机号两部分,网络号相同各主机在同一网段,相互间能够直接
7、通信,网络号不一样主机之间通信则需要经过路由器转发。 把全部IP地址分为五类,以下图1所表示: 图 2-1 A类 0.0.0.0到127.255.255.255 B类 128.0.0.0到191.255.255.255 C类 192.0.0.0到223.255.255.255 D类 224.0.0.0到239.255.255.255 E类 240.0.0.0到247.255.255.255 在分类编址A类、B类、C类地址中,IP地址可划分为net-id(网络标识)和host-id(主机标识)。对于A类地址,1字节定义net-id而3字节定义host-id。对于B类地址,2字
8、节定义net-id,2字节定义host-id。对于C类地址,3字节定义net-id而1字节定义host-id。D类地址和E类地址不划分net-id和host-id。 网络地址是一个地址块第一个地址,向因特网其它部分定义这个网络。路由器就是依据网络地址来选择分组路由。若给出网络地址,我们就能够找出这个地址类别、地址块和这个地址块地址范围。 这种划分方案有很大不足,它对网络划分是flat而不是层级结构(hierarchical)。Internet上每个路由器全部必需掌握全部网络信息,伴随大量C类网络出现,路由器需要检索路由表越来越庞大,负担越来越重。 于是提出了新划分方案,称为CIDR(Cl
9、assless Interdomain Routing)。 网络号和主机号划分需要用一个额外子网掩码(subnet mask)来表示,而不能由IP地址本身数值决定,也就是说,网络号和主机号划分和这个IP地址是A类、B类还是C类无关,所以称为Classless。这么,多个子网就能够汇总(summarize)成一个Internet上网络。 IP地址和子网掩码做和运算能够得到网络号,主机号从全0到全1就是子网地址范围。IP地址和子网掩码还有一个更简练表示方法,比如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码高24位是1,也就是255.255.255.0。
10、 目标地址为255.255.255.255,表示本网络内部广播,路由器不转发这么广播数据包。 目标地址主机号为全1,表示广播至某个网络全部主机,比如目标地址192.168.10.255表示广播至192.168.10.0网络(假设子网掩码为255.255.255.0)。 2.2.3 端口地址 计算机是多进程设备,即能够在同一时间运行多个进程。因特网通信最终目标是使一个进程能够和另一个进程通信。为了能够同时发生这些事情,需要有一个方法对不一样进程打上标号,就是说这些进程需要地址。 在TCP/IP体系结构中,给一个进程指派标号叫做端口地址。TCP/IP中端口地址是16位长,通常见10进制数表
11、示。 2.3. 分层数据包介绍 2.3 2.3.1 以太网帧 图 2-2 目标地址(DA) DA字段有6字节,是下一站物理地址(也叫MAC地址)。 源地址(SA) SA字段有6字节,是前一站物理地址。 类型 类型字段有三种值,分别对应IP、ARP、RARP。 数据 携带从上层协议封装起来数据。它最小长度是46字节,最大长度是1500字节。ARP、RARP数据包长度不够46字节,要在后面补填充位。最大值1500称为以太网最大传输单元(MTU),假如一个数据包从以太网路由到链路上,数据包长度大于链路MTU了,则需要对
12、数据包进行分片 CRC 差错检测信息,4字节。 2.3.2 ARP报文格式 图 2-3 如上图3所表示,ARP分组格式以下: 硬件类型 16位字段,用来定义运行ARP链路层网络类型。以太网是类型1。 协议类型 16位字段,指要转换地址类型。0x0800位IP地址。 硬件长度 8位字段,定义以字节为单位物理地址长度。对以太网这个值为6。 协议长度 8位字段,定义以字节为单位逻辑地址长度。对IPv4协议这个值是4。 操作 16位字段,定义分组类
13、型。为1表示ARP请求,为2表示ARP应答。 发送端硬件地址 可变长度字段,定义发送端物理地址。 发送端协议地址 定义发送端逻辑地址。 目标硬件地址 定义目标物理地址。对于ARP请求报文,这个字段是全0,因为发送端不知道目标物理地址。 目标协议地址 定义目标逻辑(如,IP)地址。 2.3.3 IP数据报格式 图 2-4 如上图4所表示,IP数据报结构包含: 版本(VER) 这个4位字段定义IP协议版本。 首部长度(HLEN) 这个4位字段定义IP首部总长度,以4字节为单位计算。当没有选项时,首部长度是20字节,这个字
14、段值是5(5*4=20)。当选项字段位最大值时,这个字段值是15(15*4=60)。 服务类型(DS) TOS位是4位子字段,共有5种不一样服务类型。 总长度 这个16位字段定义了以字节计数据报总长度(首部加上数据)。要找出上层传来数据长度,能够从总长度减去首部长度。总长度字段是16位,所以IP数据报长度限制是65535(216 - 1)字节。 标识(Identification) 这个16位字段和源IP地址一起唯一地定义这个数据报。IP协议使用一个计数器来标志数据报,当IP协议发送数据时,就把这个计数器目前值复制到标识字段中,并加1。当数据报被分片时
15、标识字段值就复制到全部分片中。换言之,全部分片含有相同标识号,即原始数据报标识号。在终点重装数据报时,终点就知道全部含有相同标识号分片必需组装成一个数据报。 标志(Flags) 3位字段。第一位保留。第二位为不分片位,为1表示不对数据报进行分片;为0表示在需要时对数据报进行分片。第三位为分片位,为1表示这个数据报不是最终分片,在其后还有分片;为0表示这个数据报是最终分片。 分片偏移(Fragment Offset) 这个13位字段表示该分片在整个数据报中相对位置,以8字节为度量单位。 生存时间(TTL) 用来控制数据报所经过最大路由跳数,这个生存时间单位不
16、是秒,而是跳(hop)。 协议 这个8位字段定义使用IP层服务高层协议。如:TCP、UDP、ICMP和IGMP等。 检验和 IP分组中检验和只在首部而不在数据部分进行。因为,全部将数据封装在IP数据报中高层协议,全部有覆盖整个分组检验和;其次,,每经过一个路由器,IP数据报首部就要改变一次,但数据部分不变。所以检验和只对发生改变部分进行检验。 源地址 这个32位字段定义源点IP地址。在IP数据报从源主机发送到目标主机时间内,这个字段必需保持不变。 目标地址 这个32位字段定义了终点IP地址。
17、在IP数据报从源主机发送到目标主机时间内,这个字段必需保持不变。 2.3.4 ICMP报文格式 类型 8位字段,定义ICMP报文类型。ICMP报文类型有:终点不可达、源点抑制、超时、参数问题、改变路由、回送请求或回复、时间戳请求或回复、地址掩码请求或回复、路由器问询和通告。 代码 8位字段,指明了发送这个特定报文类型原因。 检验和(icmpchksum) 16位字段。在ICMP中,检验和计算覆盖了整个报文(首部和数据)。 ICMP回送请求或回复报文头格式以下图5所表示: 图2-5 ICMP终点不可达报文头格式以下图6所
18、表示: 图2-6 ICMP超时报文头格式以下图7所表示: 图2-7 2.3.5 IGMP报文格式 图2-8 类型 8位字段,定义了查询、组员关系汇报、退出汇报三种报文类型,类型值分别为0x11、0x16、0x17。 最大响应时间 8位字段,定义了查询必需在多长时间内回复。它值以十分之一秒位单位。在查询报文中这个值不是零,但在其它两种报文中则置为零。 检验和 16位字段,检验和在8字节报文上计算。 组地址 在通常查询报文中这个字段值为0,在特殊查询报文、组员关系汇报报文和退出汇报
19、报文中定义groupid(组多播地址)。 2.3.6 UDP用户数据报首部格式 图2-9 UDP数据报格式如上图9所表示。 用户数据报有8个字节固定首部。 源端口号 16位字段,定义源主机上运行进程所使用端口号。 目标端口号 16位字段,定义目标主机上运行进程使用端口号。 长度 16位字段,定义了用户数据报总长度,首部加上数据。 检验和 16位字段,UDP检验和包含三部分:伪首部、UDP首部和从应用层来数据。位首部是IP分组首部一部分,包含:源IP地址、目标IP地址、8位协议和16位UD
20、P总长度。位首部能够确保在IP首部受到损伤时,用户数据报能够交付到正确主机。协议字段加入,能够确保这个分组是属于UDP而不是属于TCP。 2.3.7 TCP报文段格式 图2-10 如上图10所表示,TCP报文段结构包含: 源端口地址 这个16位字段定义发送报文段应用程序端口号。 目标端口地址 这个16位字段定义了接收该报文段应用程序端口号。 序号 这个32位字段定义了指派给本报文段第一个数据字节一个号。为了确保连通性,要发送每一个字节全部要编号。序号告诉终点,这个序列中哪一个字节是报文段中第一个字节。在连接建立时,每一方使
21、用随机数产生器产生初始序号(ISN)。 确定号 32位字段,定义了报文段接收端期望从对方接收下一个序号。假如报文段接收端成功地发送了对方发来序号x,它就把确定号定义为x+1。 首部长度(tcpoffset) 4位字段,指出TCP首部共有多少个4字节字。即TCP数据在IP数据中偏移大小。同IP首部长度,能够在5 至15之间。 保留位 该6位字段留待以后使用。 控制/标志位 该字段定义了6种不一样控制位或标志,在同一时间可设置一位或多位标志。 表2-1 控制字段各标志说明(从高位到低位)
22、 标志 说 明 URG 紧急指针字段值有效 ACK 确定字段值有效 PSH 推送数据 RST 连接必需复位 SYN 在连接建立时对序号进行同时 FIN 终止连接 窗口值 该字段定义接收方必需维持窗口值(以字节为单位)。注意,该字段是16位长,所以窗口值最大长度为65535字节。这个值由接收端来确定,发送端必需服从接收端决定。 检验和 这个16位字段包含检验和,TCP使用检验和是强制性。 紧急指针 当紧急标志位置位时,这个16位字段才有效,这时报文段中包含紧急数据。紧急指针定义了一个
23、数,把这个数加到序号上就得出报文段数据部分中最终一个紧急字节。 选项 包含无操作(NOP)、最大报文段长度(MSS)、窗口扩大因子、时间戳等。 2.4. 分层协议讲解 总来说,TCP/IP协议多路选择过程能够表示为下图2-11: 图2-11 2.4 2.4.1 ARP和RARP 2.4.1.1 地址解析协议ARP 在任何时候,当主机或路由器有数据报要发送给另一个主机或路由器时,它必需有接收端逻辑(IP)地址。不过IP数据报必需封装成帧才能经过物理网络。这就表示,发送端必需有接收端物理地址,所以需要有从逻辑地址到物理地址映射。 地址解析协议(AR
24、P)用来把IP 地址和其物理地址联络起来。任何时候当主机或路由器需要找出这个网络上另一个主机或路由器物理地址时,它就发送ARP查询分组。这个分组包含发送端物理地址和IP地址,和接收端IP地址。 因为发送端不知道接收端物理地址,查询就在网络上广播。比如,数据包要发送给IP地址为192.168.0.1主机,过程以下: 源主机发出ARP请求,问询“IP地址是192.168.0.1主机硬件地址是多少”,并将这个请求广播到当地网段(以太网帧首部硬件地址填FF:FF:FF:FF:FF:FF表示广播),目标主机接收到广播ARP请求,发觉其中IP地址和本机相符,则发送一个ARP应答数据包给源主机,将自己硬
25、件地址填写在应答包中。 ARP报文格式如前所述。 ARP软件包由5个构件组成: 高速缓存表: 每台主机全部维护一个ARP高速缓存表,因为高速缓存表空间很有限,所以缓存表中表项有过期时间(通常为20分钟),假如20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来取得目标主机硬件地址。 队列: 队列用来在ARP试图解析硬件地址时保留IP分组。输出模块把未解析分组发送到对应队列,输入模块从一个队列中拿走一个分组,并连同解析出物理地址一同发送给数据链路层来传输。 输出模块: 输出模块从IP软件等候IP分组。输出模块检验高速
26、缓存表,寻求是否有某个项目对应于这个分组目标IP地址。这个IP分组目标IP地址必需和这个项目标协议地址相匹配。 输入模块: 输入模块一直等候,直到有ARP分组抵达。检验高速缓存表,寻求对应这个ARP分组项目。输入模块设置这个项目标超时时间TIME-OUT。若队列为空,则从对应队列中把分组一个接一个地取出,连同其硬件地址一起交给数据链路层来处理。 高速缓存控制模块: 负责维护高速缓存表,它周期性地逐项检验高速缓存表,判定有哪些项目到期,哪些队列需要撤销。 2.4.1.2 逆地址解析协议RARP 当一个主机知道自己物理地址时,RARP可用来找出
27、其逻辑地址。每一个主机或路由器全部被指派一个或多个逻辑地址,这些地址和机器物理地址无关。要创建IP数据报,主机或路由器要知道它自己IP地址。能够使用RARP协议从物理地址得到逻辑地址。 知道物理地址后,先创建RARP请求,并在当地网络上广播。在当地网络上另一个机器知道全部IP地址,它就用RARP回复来响应。请求机器必需运行RARP用户程序;而响应机器必需运行RARP服务器程序。 2.4.2 IP协议 IP数据报格式如前所述。 IP是不可靠无连接协议,负责源点到终点交付。 在IP层分组叫做数据报。 数据链路层有自己帧格式,在这个格式中有一个字段是“数据字段最大长度”。当
28、数据报封装成帧时,数据报总长度必需小于这个数据字段最大长度(MTU)。 对数据报进行分割,叫做分片。源站通常不对IP分组进行分片。运输层会进行分片工作,把数据划分成IP和在使用数据链路层全部可能接纳大小。数据报在抵达终点之前能够经过数次分片,能够被源主机或在其路径上任何路由器进行分片。然而数据报重组却只能在目标主机上进行。 在IP分组中检验和只在首部而不在数据部分心进行。因为,首先全部将数据封装在IP数据报中高层协议,全部有覆盖整个分组检验和;其次,每经过一个路由器,IP数据报首部就要改变一次,但数据部分不变。所以检验和只对发生改变部分进行检验。 IP软件包包含8个构件:首部添加模块
29、处理模块、转发模块、分片模块、重装模块、路由表、MTU表和重装表,还有输入和输出队列。 首部添加模块,从高层协议接收数据(连同其IP地址),添加IP首部后,把数据封装成IP数据报。 处理模块,从一个接口或从首部添加模块接收数据报,首先检验数据报是否为回环地址,还是这个分组已抵达最终终点。 输入队列把从数据链路层或从高层协议发来数据存放起来。 输出队列把要发送到数据链路层或高层协议数据报存放起来,处理模块从中取出数据报,分片和重装模块则把这个数据报加入输出队列中。 路由表是在转发模块中使用,用来确定分组下一跳地址。 分片模块从转发模块接收IP数据报。转发模块给出IP数据报、下一站I
30、P地址。和发送这个数据报所必需经过接口号。分片模块使用MTU表方便找出对于特定接口最大传送单元MTU。若数据报长度大于MTU,则分片模块对数据报进行分片,为每一个分片添加首部,并把它们发送到ARP软件包进行地址解析和交付。 重装模块从处理模块接收已抵达最终目标地数据报分片。重装模块将未分片数据报看成是属于仅有一个分片数据报。使用重装表找出一个分片是属于哪一个数据报,将属于同一个数据报各分片进行排序,并在全部分片抵达时把它们重新组装成一个数据报。 2.4.3 ICMP协议 IP协议没有差错汇报或差错纠正机制和管理查询机制。网际控制报文协议(ICMP)就是为了赔偿这两个缺点而设计。它是配合I
31、P协议使用。 ICMP本身是网络层协议,不过它报文不是如设想那样直接传送给数据链路层,而是首先要封装成IP数据报,再传送给下一层。 在IP数据报中协议字段值是1就表示其IP数据是ICMP报文。 ICMP报文类型以下表2-2所表示: 表2-2 ICMP报文类型 ICMP报文分为两大类:差错汇报报文和查询报文。报文格式如前所述。 2.4.3.1 差错汇报报文 差错汇报报文汇报当路由器或主机在处理IP数据报时可能碰到部分问题。ICMP不能纠错,只能汇报差错,差错纠正留给高层协议去做。 ICMP总是使用源IP地址把差错报文发送给数据报源点。 一共有5种差错可处理:终点不可达、源
32、点抑制、超时、参数问题和改变路由。 l 终点不可达报文 当路由器不能够给数据报找到路由或主机不能够交付数据报时,就丢弃这个数据报,然后这个路由器或主机就向发出这个数据报源主机发回终点不可达报文。 l 源点抑制 ICMP源点抑制报文就是为了给IP增加一个流量控制而设计。当路由器或主机因拥塞而丢弃数据报时,它就向数据报发送端发送源点抑制报文。目标有二:第一,通知源点,数据报已被丢弃。第二,它警告源点,在路径中某处出现了拥塞,所以源点需放慢发送过程。注意,必需为每一个丢弃数据报向源点发送源点抑制报文。 l 超时 超时有两种情况
33、第一,当路由器接收到生存时间字段值为零数据报时,就丢弃这个数据报,并向源点发送超时报文;第二,当最终终点在要求时间内没有收到全部分片时,就丢弃已收到分片,并向源点发送超时报文。 l 参数问题 假如路由器或主机在数据报首部中发觉任何二义性,或在数据报某个字段中缺乏了某个值,就丢弃这个数据报,并发送参数问题报文。 l 改变路由 路由器路由选择是动态,而主机为了提升效率,通常使用静态路由选择。当主机开始连网工作时,其路由表中项目数很有限。它通常只知道默认路由器这一个路由器IP地址,所以主机有可能会把某个数据报发送给一个错误路由器。此时,收到这个数据报路由器会把数据报转发给正确路由器,并向主
34、机发送改变路由报文,以更新主机中路由表。 2.4.3.2 查询报文 查询报文全部是成对出现。 在这种类型ICMP报文中,一个结点发送报文,然后由目标结点用特定格式进行回复。 l 回送请求和回复报文 为诊疗目标而设计。 主机或路由器能够发送回送请求报文给另一个主机或路由器。收到回送请求报文主机或路由器产生回送回复报文,并将其返回给原来发送者。 回送请求和回复报文可用来确定是否在IP这级能够通信。还可由主机使用,以检验另一个主机是否可达。在用户级,调用分组因特网搜寻器(ping)命令可做到这点。 l 时间戳请求和回复 两个机器可使用时间戳请求和回复来确定IP数据报在这两个机器之间
35、来往所需往返时间。 l 地址掩码请求和回复 主机经过向局域网上路由器发送地址掩码请求报文来取得自己掩码。若主机知道这个路由器地址,则直接将请求发送给该路由器,若主机不知道,则广播这个请求报文。 路由器收到地址掩码请求报文,就以地址掩码回复报文进行响应,向主机提供所需掩码。 l 路由问询和通告 主机若想把数据发送给另一个网络上主机,就需要知道连接到该网络上路由器地址。另外,这个主机还需要知道这些路由器是否正常工作。就能够通告路由问询和通告报文。 主机把路由器问询报文进行广播,收到问询路由器就使用路由通告报文广播其路由选择信息。路由器发送通告报文时,不仅通告自己存在,而且通告了它所知道
36、全部在这个网络上路由器。 在ICMP中,检验和计算覆盖了整个报文(首部和数据)。 2.4.4 网际组管理协议(IGMP) 网际组管理协议(IGMP)是和多播相关一个必需但不是充足协议。IGMP并不是多播路由选择协议,而是个管理组组员关系协议。每当主机需要加入或离开某个特定多播群组时,该协议许可该主机去通知邻近路由器。 该协议只用在主机和路由器之间网络上。而且,协议只把计算机(不是应用进程)定义为群组组员。 假如在一个给定计算机上有多个进程要加入到一个多播群组,计算机必需要把接收到每个数据报复制多个副本给每个进程。只有当最终一个进程离开群组时,计算机才利用IGMP通知当地路由器,表明它
37、不再是群组组员了。IGMPv2有3种报文类型:查询、组员关系汇报和退出汇报。 IGMP可分为两个阶段: 第一阶段:当某个主机加入新多播组时,该主机应向组播组多播地址发送一个IGMP报文,申明自己要成为该组组员。当地多播路由器收到IGMP报文后,将组组员关系转发给因特网上其它多播路由器。 第二阶段:因为组组员关系是动态,所以当地多播路由器要周期性地探询当地局域网上主机,方便知道这些主机是否还连续是组组员。只要对某个组有一个主机响应,那么多播路由器就认为这个组是活跃。但一个组在经过数次探询后仍然没有一个主机响应,则多播路由器就认为本网络上主机已经全部离开这个组了所以就不再将该组组员关系转发给
38、其它多播路由器。 IGMP报文格式如前所述。 IGMP协议优点: l 主机和多播路由器全部通信使用IP多播,只要有可能,携带IGMP报文数据报全部使用硬件多播来传送。 l 多播路由器在探询组组员关系时,只需要对全部多播组只发一个查询,而不是对每一个组发送一个查询,默认125S一次。 2.4.5 用户数据报(UDP) UDP数据报格式如前所述。 UDP在应用层和IP层之间,作为应用程序和网络操作中介物。 IP是负责在计算机级通信(主机到主机通信),作为网络层协议,IP只能把报文交付给目标主机。不过,这是一个不完整交付。这个报文还必需送交到正确进程。UDP就是负责把报文交付给合适进
39、程。 完成进程到进程通信最常见方法是经过用户-服务器范例。在当地主机上叫做用户进程主动提议请求, 远程主机上叫做服务器进程被动地等候、接收和应答请求。用户端IP地址和端口号唯一标识了该主机上用户端进程,服务器IP地址和端口号唯一标识了该主机上服务端进。因为用户端是主动提议请求一方,它必需知道服务器IP地址和服务进程端口号,所以,部分常见网络协议有默认服务器端口。 TCP/IP协议族中,端口号是在0~65535之间整数。ICANN把端口号划分为3个范围:熟知端口号、注册端口号和动态(或专用)端口号。 熟知端口范围从0~1023;注册端口范围从1024~49151;动态端口范围从49152~
40、65535. 已知UDP需要两个标识符,即IP地址和端口号,各用在一端以建立一条连接。一个IP地址和一个端口号合起来叫做套接字地址。这些信息是IP首部和UDP首部一部分。 UDP提供物连接服务,即UDP发出每一个用户数据报全部是独立数据报,每一个用户数据报能够走不一样路径抵达目标进行。UDP缺乏流量控制和差错控制。 要从一个进程把报文发送到另一个进程,UDP协议就要把报文进行封装和拆装。 l 封装 当进程有报文要经过UDP发送时,它就把这个报文连同一对套接字地址和数据长度传输给UDP,加上UDP首部后,UDP把用户数据报连同套接字地址一起传输给IP。IP加上自己首部,在协议字段使用值
41、17,指出该数据是从UDP协议来。再将IP数据报传输给数据链路层,数据链路层收到IP数据报后,再加上自己首部传输给物理层。物理层将这些位编码为电信号或光信号,把它发送到远程机器。 l 拆装 报文抵达目标主机时,物理层对信号解码,将它变为位,传输给数据链路层。数据链路层使用这个首部(和尾部)检验数据。若无差错,则去掉首部和尾部,并把数据报传输给IP。IP软件进行检验,若无差错,就剥去首部,把用户数据报连同发送端和接收端IP地址一起传输给UDP。UDP使用检验和对整个用户数据报进行检验。若无差错则剥去首部,把应用数据传输给接收进程。在需要回复收到报文时,应把发送端套接字地址一起传输给接收进程。
42、 UDP软件包共包含5个构件:一个控制块表、若干个输入队列、一个控制块模块、一个输入模块和一个输出模块。在UDP中,队列是和端口相关联在一起。这里实现只创建和每一个进程相关联输入队列,而不创建输出队列。 l 控制块表 UDP控制块表来统计打开端口。表中每一个项目有最小4个字段:状态(FREE或IN-USE)、进程ID、端口号和对应队列号。 l 输入队列 使用了一组输入队列,每一个对应于一个进程。 l 控制块模块 负责管理控制块表。当进程开启时,它就从操作系统请求得到一个端口号。操作系统把熟知端口号指派给服务器,而把短暂端口号指派给用户。进程把进程ID和端口号传输给控制块
43、模块,方便在表中为这个进程创建一个项目。这个模块不创建队列。队列数字段值为零。 l 输入模块 输入模块从IP接收用户数据报。它查找控制块表,查找含有和这个用户数据报一样端口号项目。若找到这么项目,模块就利用这项目中信息把这个数据放入队列。若未找到这么项目,它就产生ICMP“端口不可达”报文,并丢弃这个项目。 l 输出模块 负责创建和发送用户数据报。 2.4.6 传输控制协议(TCP) TCP叫做面向连接、可靠运输协议。它提供进程到进程、全双工和面向连接服务。TCP使用滑动窗口机制实现流量控制,来避免接收端因数据过多而过载;使用差错控制来提供可靠服务。 两个设备之间使用TCP软件传
44、送数据单元叫做报文段,它有20~60字节首部,首部后面是来自应用程序数据。首部结构如前所述。 2.4.6.1 TCP连接 TCP连接通常包含3个阶段:连接建立、数据传送和连接终止。 连接建立需要三向握手: l 用户发送第一个报文段,SYN报文段,在这个报文段中只有SYN标志位置1.这个报文段作用是使序号同时。SYN报文段是控制报文段,不携带任何数据,不过消耗一个序号。当数据传送开始时,每发送一个字节,序号应该加1. 在接收端能够依据序号排出数据包正确次序,也能够发觉丢包情况。 l 服务器发送第二个报文段,SYN+ACK报文段,有两个标志位置1(SYN和ACK)。服务器使用这个报文段同
45、时初始序号,方便从服务器向用户发送字节。使用ACK确定已从用户端收到了SYN报文段,确定号为用户端发送SYN报文段序号值加1. l 用户发送第三个报文ACK,确定号为服务器发送报文段序号值加1。该报文段序号和SYN报文段使用序号一样。 ACK报文段假如不携带数据就不消耗序号。 连接建立后,数据开始双向传送: 在数据传输过程中,ACK和确定序号是很关键,应用程序交给TCP协议发送数据会暂存在TCP层发送缓冲区中,发出数据包给对方以后,只有收到对方应答ACK段才知道该数据包确实发到了对方,能够从发送缓冲区中释放掉了,假如因为网络故障丢失了数据包或丢失了对方发回ACK段,经过等候超时后TCP
46、协议自动将发送缓冲区中数据包重发。 以上情况只描述了最简单一问一答情景,实际上TCP协议为应用层提供了全双工(full-duplex)服务,双方全部能够主动甚至同时给对方发送数据。假如通讯过程只能采取一问一答方法,收和发两个方向不能同时传输,在同一时间只许可一个方向数据传输,则称为'''半双工(half-duplex)''',假设某种面向连接协议是半双工,则只需要一套序号就够了,不需要通讯双方各自维护一套序号了。 参与交换数据双方中任何一方全部能够关闭连接, 连接终止四向握手: l 在正常情况下,用户机TCP接收到用户进程发来关闭命令后,就发送第一个报文段——把FIN位置1
47、假如FIN报文段不携带数据,它消耗一个序号。同时更改状态为FIN_WAIT_1,关闭应用程序进程。 l 服务器TCP在收到这个FIN报文段后,向自己对应进程发送一个文件结束符EOF,同时更改状态为CLOSE_WAIT,并发送第二个报文段——ACK,以证实从用户端收到了FIN报文段。假如不携带数据,用户端接到ACK后状态更改为FIN_WAIT_2。 l 服务器关闭应用程序进程,更改状态为LAST_ACK。并发送第三个报文段——FIN,若不携带数据,FIN消耗一个序号。 l 用户TCP接收到FIN后,更改状态为TIME-WAIT,同时发送最终一个报文段——ACK,证实从TCP服务器收到了一
48、个FIN报文段,该报文段确实定号等于从服务器发送FIN报文段序号加1 。 除上述情况外,建立连接时,用户端和服务器端能够同时打开;关闭连接时,能够同时关闭或进行三向握手。 TCP状态机转换图以下所表示: 图2-12 TCP多种状态以下表2所表示: 表2-3 TCP多种状态 状态 说明 CLOSED 没有连接 LISTEN 收到了被动打开,等候SYN SYN-SENT 已发送SYN;等候ACK SYN-RCVD 已发送SYN+ACK;等候ACK ESTABLISHED 连接已建立;数据传送在进行 FIN-
49、WAIT-1 第一个FIN已发送;等候ACK FIN-WAIT-2 对第一个FINACK已收到;等候第二个FIN CLOSE-WAIT 收到第一个FIN,已发送ACK;等候应用程序关闭 TIME-WAIT 收到第二个FIN,已发送ACK;等候2MSL超时 LAST-ACK 已发送第二个FIN;等候ACK CLOSING 双方全部已决定同时关闭 2.4.6.2 流量控制: 假如发送端发送速度较快,接收端接收到数据后处理速度较慢,而接收缓冲区大小是固定,就会丢失数据。TCP协议经过'''滑动窗口(Slidin
50、g Window)'''机制处理这一问题。 TCP在接收缓存上定义一个窗口,TCP发送数据多少由滑动窗口协议定义。 为了完成流量控制,TCP使用滑动窗口协议。两个主机为向外通信(发送数据)各使用一个窗口,这个接收窗口覆盖了缓存一部分。这个窗口有两个沿:一个在左边,另一个在右边。这个窗口叫做滑动窗口,因为左沿和右沿全部能够滑动。窗口能够展开、合拢或缩回,这三种活动受接收端而不是发送端控制(取决和网络上拥塞状态),发送端必需听从接收端命令。通常,窗口缩回必需避免。 TCP滑动窗口是面向字节,窗口大小取决于接收窗口(rwnd)和拥塞窗口(cwnd)中较小值。 接收端在一段时间内不愿意从发送端






