TCP/IP详解部分笔记整理(三)传输层(UDP)

UDP协议

UDP为应用程序发送和接收数据报。一个数据报是指从发送方传输到接收方的一个信息单元,UDP是不可靠的,它不能保证数据报能安全无误地到达最终目的。

图片17

 

 

首部很简单,共8字节。包括:

源端口(SourcePort):2字节,源端口号。

目的端口(DestinationPort):2字节,目的端口号。

长度(Length):2字节,UDP用户数据报的总长度,以字节为单位。

检验和(Checksum):2字节,用于校验UDP数据报的数字段和包含UDP数据报首部的“伪首部”。其校验方法同IP分组首部中的首部校验和。

伪首部,又称为伪包头(PseudoHeader):是指在TCP的分段或UDP的数据报格式中,在数据报首部前面增加源IP地址、目的IP地址、IP分组的协议字段、TCP或UDP数据报的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。

图片18

TCP为两台主机提供高可靠性的数据通信。UDP则为应用层提供一种非常简单的服务它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。

UDP的最大数据报长度

IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。原因:

A:应用程序可能会受到其程序接口的限制

B:第二个限制来自于TCP/IP的内核实现

 

UDP广播和多播

分类

单播:主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用单播模式,具体的说就是IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。

单播的优点:

1)服务器及时响应客户机的请求

2)服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。

单播的缺点:

1)服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。

2)现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞。而将主干扩展20倍几乎是不可能。

 

广播:主机之间一对所有的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。

广播的优点:

1)网络设备简单,维护简单,布网成本低廉2)由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。广播的缺点:1)无法针对每个客户的要求和时间及时提供个性化服务。

2)网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。3)广播禁止允许在Internet宽带网上传输。

 

组播:主机之间一对一组的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。这样既能一次将数据传输给多个有需要(加入组)的主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。

组播的优点:

1)需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。

2)由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个组播,所以其提供的服务可以非常丰富。3)此协议和单播协议一样允许在Internet宽带网上传输。

组播的缺点:

1)与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。

2)现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中。

 

主机对由信道传送过来帧的过滤过程。

1:网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序.通常网卡仅接收那些目的地址为网卡物理地址或广播地址的帧。另外,多数接口均被设置为混合模式,这种模式能接收每个帧的一个复制。

2:如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错,网卡将丢弃该帧)。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(IP、ARP等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。目前,大多数的网卡经过配置都能接收目的地址为多播地址或某些子网多播地址的帧。对于以太网,当地址中最高字节的最低位设置为1时表示该地址是一个多播地址

3:设备驱动程序随后将数据帧传送给下一层,比如,当帧类型指定为IP数据报时,就传往IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤检测。如果正常,就将数据报传送给下一层

4:每次UDP收到由IP传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个ICMP不可达报文(TCP根据它的端口号作相似的过滤)。如果UDP数据报存在检验和错,将被丢弃。

5:使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用UDP广播应用作为例子。如果网内有50个主机,但仅有20个参与该应用,每次这20个主机中的一个发送UDP广播数据时,其余30个主机不得不处理这些广播数据报。一直到UDP层,收到的UDP广播数据报才会被丢弃。这30个主机丢弃UDP广播数据报是因为这些主机没有使用这个目的端口。

 

四类IP广播地址

1:受限的广播(永远不被转发)

受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。一个未解的问题是:如果一个主机是多接口的,当一个进程向本网广播地址发送数据报时,为实现广播,是否应该将数据报发送到每个相连的接口上?如果不是这样,想对主机所有接口广播的应用必须确定主机中支持广播的所有接口,然后向每个接口发送一个数据报复制。

2:指向网络的广播(以网络为目的向netid广播)

指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

3:指向子网的广播

指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,如果路由器收到发往128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为255.255.254.0,该地址就不是指向子网的广播地址。

4:指向所有子网的广播

指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1。

 

多播(组播):同时向一组选定的目的地传输数据的一种网络服务。(D类IP地址被称为多播组地址)

1)向多个目的地址传送数据。

2)客户对服务器的请求。

1:D类IP地址对应的:1110+28BIT的多播组ID分配的28bit均用作多播组号而不再表示其他。范围从224.0.0.0到239.255.255.255。

2:使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。能够接收发往一个特定多播组地址数据的主机集合称为主机组(hostgroup)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。

3:当一台主机欲加入某个多播组时,会发出“主机成员报告”的IGMP消息通知多播路由器。当多播路由器接收到发给那个多播组的数据时,便会将其转发给所有的多播主机。多播路由器还会周期性地发出“主机成员查询”的IGMP消息,向子网查询多播主机,若发现某个多播组已没有任何成员,则停止转发该多播组的数据。此外,当支持IGMPv2的主机(如Windows98/2000计算机)退出某个多播组时,还会向路由器发送一条“离开组”的IGMP消息,以通知路由器停止转发该多播组的数据。但只有当子网上所有主机都退出某个多播组时,路由器才会停止向该子网转发该多播组的数据。

 

使用多播路由协议,路由器可建立起从多播源节点到所有目的节点的多播路由表,从而实现在子网间转发多播数据包。

 

 

UDP打洞

wiki中关于udp打洞的描述:通过UDP打洞实现NAT穿越是一种在处于使用了NAT的私有网络中的Internet主机之间建立双向UDP连接的方法。由于NAT的行为是非标准化的,因此它并不能应用于所有类型的NAT。

基本思想:让位于NAT后的两台主机都与处于公共地址空间的、众所周知的第三台服务器相连,然后,一旦NAT设备建立好UDP状态信息就转为直接通信,并寄希望于NAT设备会在分组其实是从另外一个主机传送过来的情况下仍然保持当前状态。

知识储备:

NAT简介

NAT(NetworkAddressTranslation,网络地址转换)是一种广泛应用的解决IP短缺的有效方法,NAT将内网地址转和端口号换成合法的公网地址和端口号,建立一个会话,与公网主机进行通信。

NAT分类

NAT从表面上看有三种类型:静态NAT、动态地址NAT、地址端口转换NAPT。

(1)静态NAT:静态地址转换将内部私网地址与合法公网地址进行一对一的转换,且每个内部地址的转换都是确定的。

(2)动态NAT:动态地址转换也是将内部本地地址与内部合法地址一对一的转换,但是动态地址转换是从合法地址池中动态选择一个未使用的地址来对内部私有地址进行转换。

(3)NAPT:它也是一种动态转换,而且多个内部地址被转换成同一个合法公网地址,使用不同的端口号来区分不同的主机,不同的进程。

 

从实现的技术角度,又可以将NAT分成如下几类:全锥NAT(FullConeNAT)、限制性锥NAT(RestrictedConeNAT)、端口限制性锥NAT(PortRestrictedConeNAT)、对称NAT(SymmetricNAT)。

(1)全锥NAT:全锥NAT把所有来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。任何一个外部主机均可通过该映射发送数据包到该内部主机。

(2)限制性锥NAT:限制性锥NAT把所有来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。但是,和全锥NAT不同的是:只有当内部主机先给外部主机发送数据包,该外部主机才能向该内部主机发送数据包。

(3)端口限制性锥NAT:端口限制性锥NAT与限制性锥NAT类似,只是多了端口号的限制,即只有内部主机先向外部地址:端口号对发送数据包,该外部主机才能使用特定的端口号向内部主机发送数据包。

(4)对称NAT:对称NAT与上述3种类型都不同,不管是全锥NAT,限制性锥NAT还是端口限制性锥NAT,它们都属于锥NAT(ConeNAT)。当同一内部主机使用相同的端口与不同地址的外部主机进行通信时,对称NAT会重新建立一个Session,为这个Session分配不同的端口号,或许还会改变IP地址。

NAT的作用

NAT不仅实现地址转换,同时还起到防火墙的作用,隐藏内部网络的拓扑结构,保护内部主机。NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。这样对于外部主机来说,内部主机是不可见的。但是,对于P2P应用来说,却要求能够建立端到端的连接,所以如何穿透NAT也是P2P技术中的一个关键。

 

P2P:

点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是无中心服务器、依靠用户群(peers)交换信息的互联网体系,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上(这种技术可以大大减轻服务器的负担)。与有中心服务器的中央网络系统不同,对等网络的每个用户端既是一个节点,也有服务器的功能,任何一个节点无法直接找到其他节点,必须依靠其户群进行信息交流。.P2P网络通常用于通过AdHoc连接来连接节点(从而实现了节点之间的通讯)。这类网络可以用于多种用途,各种档案分享软件已经得到了广泛的使用(QQ聊天、迅雷、大部分网络播放器都使用了该技术)

P2P穿透NAT

要让处于NAT设备之后的拥有私有IP地址的主机之间建立P2P连接,就必须想办法穿透NAT,现在常用的传输层协议主要有TCP和UDP,下面就是用这两种协议来介绍穿透NAT的策略。

假设主机ClientA-1和主机ClientB-1都和服务器Server建立了“连接”,如图2所示。

图片19

图2.ClientA-1,ClientB-1和Server之间通信

由于NAT的透明性,所以ClientA-1和ClientB-1不用关心和Server通信的过程,它们只需要知道Server开放服务的地址和端口号即可。根据图1,假设在ClientA-1中有进程使用socket(192.168.0.2:7000)和Server通信,在ClientB-1中有进程使用socket(192.168.1.12:8000)和Server通信。它们通过各自的NAT转换后分别变成了socket(202.103.142.29:5000)和socket(221.10.145.84:6000)。

UDP打洞的过程大体上如下:

通常情况下,当进程使用UDP和外部主机通信时,NAT会建立一个Session,这个Session能够保留多久并没有标准,或许几秒,几分钟,几个小时。假设ClientA-1在应用程序中看到了ClientB-1在线,并且想和ClientB-1通信,一种办法是Server作为中间人,负责转发ClientA-1和ClientB-1之间的消息,但是这样服务器太累,会吃不消。另一种方法就是让ClientA-1何ClientB-1建立端到端的连接,然后他们自己通信。这也就是P2P连接。根据不同类型的NAT,下面分别讲解。

(1)全锥NAT,穿透全锥型NAT很容易,根本称不上穿透,因为全锥型NAT将内部主机的映射到确定的地址,不会阻止从外部发送的连接请求,所以可以不用任何辅助手段就可以建立连接。

(2)限制性锥NAT和端口限制性锥NAT(简称限制性NAT),穿透限制性锥NAT会丢弃它未知的源地址发向内部主机的数据包。所以如果现在ClientA-1直接发送UDP数据包到ClientB-1,那么数据包将会被NAT-B无情的丢弃。所以采用下面的方法来建立ClientA-1和ClientB-1之间的通信。

1.ClientA-1(202.103.142.29:5000)发送数据包给Server,请求和ClientB-1(221.10.145.84:6000)通信。

2.Server将ClientA-1的地址和端口(202.103.142.29:5000)发送给ClientB-1,告诉ClientB-1,ClientA-1想和它通信。

3.ClientB-1向ClientA-1(202.103.142.29:5000)发送UDP数据包,当然这个包在到达NAT-A的时候,还是会被丢弃,这并不是关键的,因为发送这个UDP包只是为了让NAT-B记住这次通信的目的地址:端口号,当下次以这个地址和端口为源的数据到达的时候就不会被NAT-B丢弃,这样就在NAT-B上打了一个从ClientB-1到ClientA-1的孔。

4.为了让ClientA-1知道什么时候才可以向ClientB-1发送数据,所以ClientB-1在向ClientA-1(202.103.142.29:5000)打孔之后还要向Server发送一个消息,告诉Server它已经准备好了。

5.Server发送一个消息给ClientA-1,内容为:ClientB-1已经准备好了,你可以向ClientB-1发送消息了。

6.ClientA-1向ClientB-1发送UDP数据包。这个数据包不会被NAT-B丢弃,以后ClientB-1向ClientA-1发送的数据包也不会被ClientA-1丢弃,因为NAT-A已经知道是ClientA-1首先发起的通信。至此,ClientA-1和ClientB-1就可以进行通信了。

 

UDP调用connect

udp协议提供的是面向非连接的服务,通信双方不需要建立连接。一方只需要建立好套接字,并显式或由系统绑定地址和端口号后就可以发送/接收数据包。和tcp不同的是,使用udp协议的数据报套接字(SOCK_DGRAM)并不限定唯一的通信方。既可以发送(sendto)数据给任意的接受方,也可以从任意的发送方接收(recvfrom)数据。

如果希望为一个数据报套接字指定唯一的通信方时,可以使用connect来实现这一功能。需要注意的是,在数据报套接字上使用connect并不是建立连接,不存在“握手”的过程。仅仅是为这个套接字指定一个通信方,一旦指定了对方的地址,就可以通过send/recv来发送/接收数据了。而且可以在这个数据报套接字上多次调用connect函数来指定不同的通信方。

UDP在调用sendto发送数据时候,如果发送目的地不可达(比如说服务器没有启动),sentdo函数不会错误返回。sendto函数正确返回仅表示接口输出队列上为IP数据包留出空间,但并不表示数据成功到达了目的地。这种错误称之为异步错误。如果对UDP调用connect函数,则可以保证异步错误能够正确的返回给应用进程,在调用connect时候,如果目的地不可达,则会返回给应用进程。

总结如下:

对于调用过connect的udp接口称之为已链接UDP套接口,它只包含下面3种变化。

1.会返回异步错误给应用进程。

2.从调用connect以后就不许要再使用recvfrom和sendto函数,可以用read和write函数替代。(内核记录住你的connect中目的IP和PORT)

3.没有连接的UDP套接口将会接受所有发送到绑定端口的数据(任何一个进程只要向UDP绑定端口发送数据,都会被没有链接的UDP套接口接受),已连接套接口只会接受链接的另一方的数据,不接受其它人发送过来的数据。

 

TCP/UDP调用connect区别

UDP中可以多次调用connect,TCP只能调用一次connect.

UDP多次调用connect有两种用途:

1,指定一个新的ip&port连结.

2,断开和之前的ip&port的连结.

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">