网络编程书籍讲义第四讲.ppt
第1页,人民邮电出版社,第4章 互联网络层,第2页,4.1传输层的通信与端口,4.1.1点到点通信与端到端通信在互联网中,任何两台通信的主机之间,从源端到目标端的信道都是由一段一段的点到点通信线路组成的(一个局域网中两台主机通信时只有一段点到点的线路)。直接相连的节点之间对等实体(源节点的IP层和目标节点的IP层)的通信,叫点到点(point to point)通信。点到点的通信是由网络互联层来实现的,网络互联层只是屏蔽了不同网络之间的差异,构建了一个逻辑上的通信网络,因此它只是解决了数据通信问题。现在我们的问题是在网络中传输的数据,在源主机上从何而来,送到目标主机的何处去。回答这个问题很简单,因为源主机到目标主机之间的通信,本质上是源主机上的应用程序与目标主机上的应用程序之间的通信,因此源主机上IP层要传输的数据来源于它的网络应用程序,最终要通过目标主机的IP层,送到目标主机上需要使用数据的某个特定网络应用程序。这样在源主机和目标主机之间,好像有一条直接的数据传输通路,它覆盖了低层点到点之间的传输过程,直接把源主机应用程序产生的数据,传输到目标主机使用这些数据的应用程序,这就是端到端(end to end)的通信。端到端通信是建立在点到点通信基础之上的,它是比网络互联层通信更高一级的通信方式,完成应用程序(进程)之间的通信。端到端的通信是由传输层来实现的。,第3页,4.1传输层的通信与端口,4.1.2 端口的概念与功能传输层端口的概念是怎么来的呢?我们知道,数据链路层接收到数据帧之后,由数据帧中的协议类型字段(以太网)就可以知道要把数据送到高层的哪个协议(见表3-10所示)。IP层在收到低层送来的数据时,根据IP数据报头中的上层协议类型字段,就可以知道要把IP数据报送到高层的哪个协议(见表3-2所示)。在TCP/IP协议的传输层之上是应用层,现在用户使用的操作系统都是多任务操作系统,也就是说在IP层之上,可能有多个网络应用程序(进程)在进行数据传输,哪么传输层收到的数据究竟要送到哪个应用程序呢?,第4页,4.1传输层的通信与端口,4.1.2 端口的概念与功能为了识别传输层之上不同的网络通信程序(进程),传输层引入了端口的概念。在一台主机上,要进行网络通信的进程,首先要向系统提出动态申请,由系统(操作系统内核)返回一个本地惟一的端口号,进程再通过系统调用把自己和这个特定的端口联系在一起,这个过程叫绑定(binding)。这样每个要通信的进程都与一个端口号对应,传输层就可以使用其报文头中的端口号,把收到的数据送到不同的应用程序。在TCP/IP协议中,传输层使用的端口号用一个16位的二进制数表示。因此,在传输层如果使用TCP协议进行进程通信,则可用的端口号共有64K个。由于UDP也是传输层一个独立于TCP的协议,因此使用UDP协议时也有64K个不同的端口。IP地址 用来区分 不同的网络设备的PORT 用来区分 同一个网络设备上不同的进程(应用程序),第5页,4.1传输层的通信与端口,4.1.3 常用的端口如果按上面所论述的,每个要通信的进程在通信之前,都要先通过系统调用动态的申请一个端口号。这样就有一个问题,相距遥远的两个进程,它们之间进行通信时,怎么知道对方的端口号呢?如果不知道对方进程的端口号,通信也就无法进行。其实我们知道,两个进程在进行通信时,总有一方要首先提出通信的请求,而另一方一直处于等待状态,准备来响应其它主机对它提出的请求。提出请求的一方就是客户端,响应客户的请求的一方就是服务器,这是典型的客户-服务器模式。客户端在提出请求时一定先要知道对方的端口号,为此TCP/IP协议在进行设计时,把服务器上守候进程的端口号进行静态分配。特定的服务对应一个特定的端口号,这些端口号是事先已经分配好的,是众所周知的(well-known port)的端口号。顾名思义,客户要使用的由服务器进程提供的服务,客户已经知道它们的端口号。例如,FTP服务器的TCP端口号都是21,Telnet服务器的TCP端口号都是23,TFTP(简单文件传送协议)服务器的UDP端口号是69。众所周知的端口号介于1255之间,这些端口号由Internet号分配机构IANA(Internet Assigned Numbers Authority)来管理。一些常用服务的TCP和UDP的众所周知端口号见表4-1和表4-2。,第6页,4.1传输层的通信与端口,4.1.3 常用的端口,第7页,4.1传输层的通信与端口,4.1.3 常用的端口,第8页,4.1传输层的通信与端口,4.1.3 常用的端口2561023之间的端口号通常都是由Unix系统占用,以提供一些特定的Unix服务。现在IANA管理11023之间所有的端口号。任何TCP/IP实现所提供的服务都使用11023之间的端口号。客户端口号又称作临时端口号(即存在时间很短暂)。这是因为客户端口号是在客户程序要进行通信之前,动态的从系统申请的一个端口号。然后以该端口号为源端口,使用某个众所周知的端口号为目标端口号(如在TCP协议上要进行文件传输时使用21)进行客户端到服务器端的通信,通信完成后,客户端的端口号就被释放掉,而服务器只要其服务在运行,其相应端口上的服务就存在。另外,大家可能已经想到了,当服务器要向客户端传输数据时,服务器怎么知道客户端临时分配的端口号呢?由于服务器可以从客户的请求报文中获得其端口号,因此也可以正常通信。大多数TCP/IP实现时,给临时端口分配10245000之间的端口号。大于5000的端口号是为其它服务预留的(Internet上并不常用的服务)。综上所述,我们知道两台要通信的主机,每一端要使用一个二元地址(IP地址,端口号),才可以完成它们之间的通信。端到端之间的一条通信就可能表示为(源主机IP地址,源端口号;目标主机IP地址,目标端口号),IP地址用来标识互联网中的两台通信的特定主机,端口号用来标识特定主机上通信的进程。在进行网络程序设计时这是最基本的知识。,第9页,4.2用户数据报协议(UDP),4.2.1 UDP数据报UDP(User Data Protocol)是网络层之上常用的一个非常简单的协议,它主要是在IP层之上提供了协议端口功能,以标识源主机和目标主机上通信的进程。因此,UDP只能保证进程之间通信的最基本要求,而没有提供数据传输过程中的可靠性保证措施,所以大家常把它称为无连接,不可靠的通信协议,这可以通信它的协议格式非常明显地看出。UDP协议在工作时是建立在IP协议之上的,UDP从进程的缓冲区接收进程每一次产生的输出,对每次输出都生成一个UDP数据报,然后把生成的UDP数据报直接封装在IP数据报中进行传输,因此在传输层使用UDP协议时,发送端不需要发送缓冲区。被封装在IP报文中的UDP数据报,通过网络传输到目标主机的IP层后,由目标主机的UDP层根据目标端口号送到接收该数据的相应进程。,第10页,4.2用户数据报协议(UDP),4.2.1 UDP数据报,第11页,4.2用户数据报协议(UDP),4.2.2 伪首部与校验和UDP头部的校验和是一个用16位二进制数表示的错误检查字段,它是一个可选项。如果发送端为了提高UDP协议的工作效率,可以不计算该字段的值,这时填入0。UDP校验和的计算除了包含UDP首部和UDP数据区外,还包含了一个12个字节长的伪首部(pseudo header)。顾名思义,这个伪首部它并不是UDP的真正组成部分,它只是为了UDP在进行差错检查时,可以把更多的信息包含进去而人为加上的。伪首部的格式如图4-5所示。从伪首部的构成就可以看出,它主要是加入了IP地址信息,因为如图4-4所示的UDP数据报中并不包含与IP地址有关的信息,如果只以UDP数据报为依据计算校验和,就无法对目标地址的正确性进行检查。,第12页,4.2用户数据报协议(UDP),伪首部包含IP首部的一些字段,填充域全填0,目的是使伪首部为16位二进制数的整数倍,这是计算校验和时所需要的。协议字段的值为17,UDP长度为UDP数据报的总长(当然不能包括虚构的伪首部)。源端在发送UDP数据报时,使用构造的UDP伪首部和UDP数据报计算出校验和(校验和的计算方法同IP首部校验和的计算方法相同),然后填入UDP首部。目标端在收到UDP数据报时,同样使用构造的UDP伪首部和UDP数据报计算出校验和,在计算时如果包括校验和字段,则计算结果为0(如果不包括校验和字段,则计算结果应与源端计算的结果一样),表明报文在传输过程中没有出现差错。另外,还有两个问题,一是在计算UDP校验和时,如果UDP数据报(UDP的首部为8个字节,但数据区长度是可变的)的总长度为奇数个字节,就要在数据报最后增加一个值为0的填充字节,这只是为了检验和的计算(因为检验和的算法是以16位二进制数为一个量计算的),但该字节并不一定被传送出去。二是如果检验和的计算结果为0时,则校验和存入的值为全1(即65535,表示0的反码),以区别没有计算校验和时直接填入的0。,第13页,4.2用户数据报协议(UDP),从UDP协议的数据报格式可以看出,UDP对数据的封装非常简单,主要加了端口号与校验和后,直接通过IP层进行传输,因此它具有如下的几个特点:UDP是一种无连接、不可靠的数据报传输服务协议。UDP不与远端的UDP模块保持端对端的连接,它仅仅是把数据报发向网络,并从网络接收传来的数据报。关于连接的问题学完TCP后,可能更容易理解。UDP对数据传输过程中惟一的可靠保证措施是进行差错校验,如果发生差错,则只是简单的抛弃该数据报。如果目标端收到的UDP数据报中的目标端口号,不能与当前已使用的某端口号匹配时,则将该数据报抛弃,并发送目标端口不可达的ICMP差错报文。UDP协议在设计时的简单性,是为了保证UDP在工作时的高效性和低延时性。因此,在服务质量较高的网络中(如局域网),UDP可以高效地工作。UDP常用于传输延时小,对可靠性要求不高,有少量数据要进行传输的情况,如DNS(域名服务)、TFTP(简单文件传输)等。,第14页,4.3传输控制协议(TCP),4.3.1 TCP报文段格式TCP提供一种面向连接的、可靠的数据流服务。因为它的高可靠性,使TCP协议成为传输层最常用的协议,同时也是一个比较复杂的协议。TCP和IP一样是TCP/IP协议簇中最重要的协议。TCP报文段(TCP报文常称为段或TCP报文段)与UDP数据报一样也是封装在IP中进行传输的,只是IP报文的数据区为TCP报文段。TCP报文段的格式如图形4-6所示。,第15页,4.3传输控制协议(TCP),1TCP源端口号TCP源端口号长度为16位,用于标识发送方通信进程的端口。目标端在收到TCP报文段后,可以用源端口号和源IP地址标识报文的返回地址。2TCP目标端口号TCP目标端口号长度为16位,用于标识接收方通信进程的端口。源端口号和IP首部中的源端IP地址,目标端口号和目标端IP地址,这四个数就可以惟一确定从源端到目标端的一对TCP连接。3序列号序列号长度为32位,用于标识TCP发送端向TCP接收端发送数据字节流的序号。序列号的实际值等于该主机选择的本次连接的初始序号ISN(Initial Sequence Number)加上该报文段中第一个字节在整个数据流中的序号。由于TCP为应用层提供的是全双工通信服务,这意味数据能在两个方向上独立地进行传输,因此,连接的每一端必须保持每个方向上传输数据的序列号,当序列号到达232-1后又从0开始。序列号保证了数据流发送的顺序性,是TCP提供的可靠性保证措施之一。,第16页,4.3传输控制协议(TCP),4确认号确认号长度为32位,因为接收端收到的每个字节都被计数,这样它可用来标识接收端希望收到的下一个TCP报文段第一个字节的序号。既然,确认号包含发送确认的一端希望收到的下一个字节的序列号,因此,确认号应当是上次已成功收到数据字节的序列号加1。确认号字段只有ACK标志(下面介绍)为1时才有效。在下一小节介绍完连接的建立后我们就会明白,一旦一个连接建立起来,这个字段总是有效的,也就是说ACK标志字段也总是被设置为1。5首部长度该字段用4位二进制数表示TCP头部的长短,它以32位二进制数为一个计数单位。TCP首部长度一般为20个字节,因此通常它的值为5。但当首部包含选项时该长度是可变的。首部长度主要用来标识TCP数据区的开始位置,因此又称为数据偏移。6保留保留字段长度为6位,该域必须置0。准备为将来定义TCP新功能时使用。,第17页,4.3传输控制协议(TCP),7标志标志域长度为6位,每1位标志可以打开或关闭一个控制功能,这些控制功能与连接的管理(下小节讲述)和数据传输控制有关,它们是:URG:紧急指针(urgent pointer)标志,置1时,紧急指针有效(下面介绍)。ACK:确认号标志,置1时,确认号有效。如果ACK为0,那么TCP首部中包含的确认号字段应被忽略。PSH:push操作标志,当置1时,表示要对数据进行push操作。push操作的功能说明如下:在一般情况下,TCP要等待到缓冲区满时,才把数据发送出去,而当TCP软件收到一个push操作后,表明该数据要立即进行传输,因此TCP协议层首先把TCP首部中的标志域PSH置1,并不等缓冲区满就把数据立即发送出去。同样,接收端在收到PSH标志为1的数据时,也立即将收到的数据传输给应用程序。RST:连接复位标志,表示由于主机崩溃或其它原因而出现错误时的连接。可以用它来表示非法的数据段或拒绝连接请求。例如,当源端请求建立连接的目标端口上没有服务进程时,目标端产生一个RST置位的报文,或当连接的一端非正常终止时,它也要产生个RST置位的报文。一般情况下,产生并发送一个RST置位的TCP报文段的一端,总是发生了某种错误或操作无法正常进行下去。,第18页,4.3传输控制协议(TCP),7标志SYN:同步序列号标志,它用来发起一个连接的建立(建立连接时握手操作的标志,下小节介绍),也就是说只有在连接建立的过程中SYN才被置1。FIN:连接终止标志,当一端发送FIN标志置1的报文时,告诉另一端已无数据可发送,即已完成了数据发送任务。但它还可以继续接收数据。8窗口大小窗口大小字段长度为16位,它是接收端的流量控制措施,用来告诉另一端它的数据接收能力。连接的每一端把可以接收的最大数据长度(其本质为接收端TCP可用的缓冲区大小),通过TCP发送报文段中的窗口字段来通知对方,对方发送数据的总长度不能超过窗口大小。窗口的大小用字节数表示,它起始于确认号字段指明的值,窗口最大长度为65535个字节。通过TCP报文段首部的窗口刻度选项,它的值可以按比例变化,以提供更大的窗口。,第19页,4.3传输控制协议(TCP),9校验和校验和字段长度为16位,用于进行差错校验。检验和覆盖了整个的TCP报文段的首部和数据区。这是一个强制性的字段,一定要由发送端计算并填入,由接收端进行验证。TCP检验和的计算方法和UDP检验和的计算方法相似,要使用一个与图4-5所示一样的伪首部,但协议字段的值为6,表示为TCP协议。10.紧急指针紧急指针字段长度为16位,只有当URG标志置1时紧急指针才有效,它的值指向紧急数据最后一个字节的位置(如果把它的值与TCP头部中的序列号相加,表示紧急数据最后一个字节的序号,在有些实现中指向最后一个字节的下一个字节)。如果URG标志没有被设置,紧急指针域用0填充。要说明的是TCP协议层提供了这种“紧急方式(urgent mode)”,但TCP对紧急数据知之甚少,只能告诉另一端有些具有某种方式的“紧急数据”已经被放置在普通的数据流中和这些数据最后一个字节的指针,具体对于紧急数据的定义和处理由应用程序决定。,第20页,4.3传输控制协议(TCP),11.选项选项的长度不固定,通过选项使TCP可以提供一些额外的功能。每个选项由选项类型(占1个字节)、该选项的总长度(占1个字节)和选项值组成。12.填充长度不定,用于填充以保证TCP首部的长度为32位的整数倍,值全为0。,第21页,4.3传输控制协议(TCP),4.3.2TCP连接的建立与关闭TCP是一个面向连接的协议,所以在进行数据传输前,通信的源端和目标端之间必须先建立一条连接,然后才能进行数据传输,在通信结束时要终止连接。这是TCP保证数据可靠传输的主要措施之一。下面我们讨论连接的建立和关闭问题。TCP在IP之上工作,IP本身是一个无连接的协议,在无连接的协议之上要建立连接,在一般人看来,这是TCP协议令人费解的一个问题。但读者一定要清楚,这里的连接是指在源端和目标端之间建立的一种逻辑连接,使源端和目标端在进行数据传输时彼此达成某种共识,相互可以识别对方及其传输的数据。连接在TCP协议层的内部表现为一些缓冲区和一组协议控制机制,外部表现为比无连接的数据传输具有更高的可靠性。1.建立连接互联网中两台要进行通信的主机,在一般情况下,总是其中的一台主动提出通信的请求(客户机),另一台被动的响应请求(服务器)。如果传输层使用TCP协议,则在通信之前要求通信的双方首先要建立一条连接。TCP使用“3次握手”(3-way handshake)法来建立一条连接。所谓3次握手就是指在建立一条连接时通信双方要交换3次报文。连接的建立过程可以用图4-8表示。具体过程如下:,第22页,4.3传输控制协议(TCP),4.3.2TCP连接的建立与关闭第1次握手:由客户机的应用层进程向其传输层TCP协议发出建立连接的命令,则客户机TCP向服务器上提供某特定服务的端口发送一个请求建立连接的报文段,该报文段中SYN被置1,同时包含一个初始序列号x(系统保持着一个随时间变化的计数器,建立连接时该计数器的值即为初始序列号,因此不同的连接初始序列号不同)。第2次握手:服务器收到建立连接的请求报文段后,发送一个包含服务器初始序号y,SYN被置1,确认号置为x+1的报文段作为应答。确认号加1是为了说明服务器已正确收到一个客户连接请求报文段,因此从逻辑上来说一个连接请求占用了一个序号。第3次握手:客户机收到服务器的应答报文段后,也必须向服务器发送确认号为y+1的报文段进行确认。同时客户机的TCP协议层通知应用层进程,连接已建立,可以进行数据传输了。,第23页,4.3传输控制协议(TCP),4.3.2TCP连接的建立与关闭通过以上3次握手,两台要通信的主机之间就建立了一条连接,相互知道对方的哪个进程在与自己进行通信,通信时对方传输数据的顺序号应该是多少。连接建立后通信的双方可以相互传输数据,并且双方的地位是平等的。如果在建立连接的过程中握手报文段丢失,则可以通过重发机制进行解决(下面介绍)。如果服务器端关机,则客户端收不到服务器端的确认,客户端按某种机制重发建立连接的请求报文段若干次后,就通知应用进程,连接不能建立(超时)。还有一种情况是当客户请求的服务,在服务器端没有对应的端口提供时,则服务器端以一个复位报文应答(RTS=1),连接也不能建立。最后要说明一点建立连接的TCP报文段中,只有报文头(无选项时长度为20个字节),没有数据区。,第24页,4.3传输控制协议(TCP),4.3.2TCP连接的建立与关闭2.关闭连接由于TCP是一个全双工协议,因此在通信过程中两台主机都可以独立的发送数据,完成数据发送的任何一方可以提出关闭连接的请求。关闭连接的过程中,由于在每个传输方向既要发送一个关闭连接的报文段,又要接收对方的确认报文段,因此关闭一个连接要经过4次握手。具体过程如下(下面设客户机首先提出关闭连接的请求):第1次握手:由客户机的应用进程向其TCP协议层发出终止连接的命令,则客户TCP协议层向服务器TCP协议层发送一个FIN被置1的关闭连接的TCP报文段。第2次握手:服务器的TCP协议层收到关闭连接的报文段后,就发出确认,确认号为已收到的最后一个字节的序列号加1。同时把关闭的连接通知其应用进程,告诉它客户机已经终止了数据传送。在发送完确认后,服务器如果有数据要发送,则客户机仍然可以继续接收数据,所以把这种状态叫半关闭(half-close)状态,因为服务器仍然可以发送数据,并且可以收到客户机的确认,只是客户方已无数据发向服务器了。,第25页,4.3传输控制协议(TCP),4.3.2TCP连接的建立与关闭2.关闭连接第3次握手:如果服务器应用进程也没有要发送给客户方的数据了,就通告其TCP协议层关闭连接。这时服务器的TCP协议层向客户机的TCP协议层发送一个FIN置1的报文段,要求关闭连接。第4次握手:同样客户机收到关闭连接的报文段后,向服务器发送一个确认,确认号为已收到数据的序列号加1。当服务器收到确认后,整个连接被完全关闭。,第26页,4.4TCP与UDP的比较,TCP和UDP是Internet传输层使用的两个主要协议。我们在后面进行网络程序设计时,往往要根据不同的情况做出选择,这就要求我们对这两个协议的特点要有一个比较明确的认识,因此在学习完本章的内容后,对这两个协议我们进行一下比较。,第27页,4.4TCP与UDP的比较,