UDP套接字(目的IP地址,目的端口号),若两个UDP报文段有不同源IP地址和/或源端口号,但有相同目的IP地址和目的端口号,则这两个报文段将通过相同的套接字被定向到相同的目的进程。
TCP套接字(源IP地址,源端口号,目的IP地址,目的端口号),当一个TCP报文段从网络到达一台主机时,使用全部4个值将报文段分解到相应套接字。两个具有不同源IP地址或源端口号的TCP报文段将被定向到不同的套接字。
客户套接字地址唯一定义了客户进程,而服务器套接字地址唯一地定义了服务器进程。
TCP与UDP报文段结构中端口号都是16比特,可以有在0---65535范围内的端口号。对于这65536个端口号有以下的使用规定:
(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1---1023之间的端口号(周知端口号),是由ICANN来管理的;
(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;
(3)大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。大于5000的端口号是为其他服务器预留的。
UDP报文段结构:
UDP有两个字段:数据字段和首部字段。
首部字段,由4个字段组成,每个字段的长度都是两个字节,共有8个字节。
UDP报文格式:
![](https://img-my.csdn.net/uploads/201204/10/1334069453_5734.png)
1)源端口号: 数据发送方的端口号。在需要对方回信时选用。不需要时可用全0。
2)目的端口号:数据接收方的端口号。这在终点交付报文时必须要使用到。
3)长度: UDP用户数据报的长度,其最小值是8(仅有首部)。
4)校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。
发送方的UDP对报文段中的所有16比特字的和进行反码运算,求和时遇到的任何溢出都要被回卷(可以先加如果有必要回卷的进行回卷再进行反码运算),得到的结果被放在UDP报文段中的检验和字段。在接收方,把检验和与所有的16比特字进行相加,如果分组无差错,则结果全部为1。如果出现了0,则分组中出现了差错,丢弃受损报文段。
- UDP首部中校验和的计算方法有些特殊。在计算校验和时,要在UDP用户数据报之前增加12个字节的伪首部。
- 伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。
- 与IP数据报的校验和只校验IP数据报的首部不同,UDP的校验和是把首部和数据部分一起都校验。
伪首部:
伪首部:是指在 TCP 的分段或 UDP 的数据报格式中,在报文段首部前面增加源 IP 地址、目的 IP 地址、IP 分组的协议字段、TCP 或 UDP 报文段的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。
![](https://i-blog.csdnimg.cn/blog_migrate/843101b224c0c1b8f06e4baaf2006c5b.jpeg)
5) 数据:UDP 的数据部分如果不为偶数需要用 0 填补,就是说,如果数据长度为奇数,数据长度加“1”。
多路复用与多路分解
一个进程(作为网络应用的一部分)有一个或多个套接字(socket),它相当于从网络向进程传递数据和从进程向网络传递数据的门户。将运输层报文段中的数据交付到正确的套接字的工作称为多路分解(demultiplexing)。
而在源主机中从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用(multiplexing)。
主机上每个套接字都有分配一个端口号,当报文段到达主机时,运输层检查报文段的目的端口号,将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进程。
1、无连接的多路复用和多路分解
在运输层,无连接的网络传输是通过UDP来实现的。UDP报文中只有源端口号和目的端口号,一个UDP套接字是由一个含有目的IP地址和目的端口号的二元组来全面标识的。在客户端,源端口号是客户进程套接字的端口号,目的端口号是服务器的端口号。而在服务器端,源端口号是服务器的创建的套接字的端口号,而目的端口号是客户端的套接字的端口号。
例如主机A产生了一个UDP报文段,报文段中就会包括源端口号(11111)、目的端口号(22222)、程序数据(还有两个其他的值:长度和检验和)。然后,运输层将生成的报文段交给网络层。网络层将其放到一个IP数据报中,并提供尽力而为的交付,将其发送到主机B中。如果该数据报到达主机B,主机B运输层就会检查该报文段的目的端口号,并将该报文段传递给套接字的端口号为接收到的报文段的目的端口号(22222)的套接字。从而实现了进程间的网络通信。而源端口号的作用是为了让主机B能向主机A发送信息的,即,当主机B在接收到主机A的数据后,要向主机A发送一个回应时,主机B发送的报文段的目的端口号就是11111.
IP地址对应着一台主机,而端口号对应着一台主机上的一个进程(或套接字)。
2、面向连接的多路复用和多路分解
网络上主机间的进程间通信,实质上是通过套接字来实现的。在运输层中面向连接的网络传输多使用TCP,TCP套接字是由一个四元组(源IP地址、源端口号,目的IP地址,目的端口号)来标识的。当一个TCP报文段从网络到达一台主机时,主机会使用全部4个值来将报文段定向,即多路分解到相应的套接字。
与UDP不同的是,两个具有不同源IP或源端口号的到达的TCP报文段将被重定向到两个不同的套接字。
尽管如此,而TCP的多路利用和多路分解的工作原理与无连接的UDP的多路复用和多路分解的原理还是大致一样的。
想想为什么
TCP的多路复用和多路分解要这样设计呢?个人认为,这是因为TCP和UDP对待接收到的数据的处理方式不同所致的。我们以服务器上的TCP套接字和UDP套接字为例,假定服务器接收客户端的数据,并把数据发送回客户端。
当一个UDP服务器接收到一个UDP报文段时,它会
根据收到的UDP报文段的源IP和源端口号,把数据发送回客户端
,它并不需要创建一个新的套接字来处理该报文段;
而对于一个TCP服务器,当它接受一个连接时,它会
产生一个新的套接字,然后通过新的套接字来与客户端通信
,也就是通过新的套接字来把数据发送回给客户端。由于每一个连接都会产生一个新的套接字,所以具有不同的源IP或源端口号的连接就是一个不同的连接,对应着产生的新的不同的套接字。
试想一下,如果TCP套接字也是使用像UDP那样的只用源端口号和目的端口号来完全标识一个套接字,那么当客户机A有一个Http连接时,该TCP报文的目的端口号为80,目的IP地址为TCP服务的IP地址。TCP服务器产生一个新的套接字来处理该请求,此时,客户机B又有一个Http连接,TCP报文的目的端口号也为80,目的IP地址也为TCP服务的IP地址。而TCP套接字也是使用像UDP那样,两个具有不同的源Ip或源端口号但具有相同目的IP和目的端口的报文段定位到同一个套接字中,那么这个客户机B的TCP报文段则会多路分解到客户机A的套接字上,而该套接字并不应该被客户机B的Http连接使用。