TCP/IP五层网络模型------传输层之端口号,UDP协议

        本文将介绍TCP/IP五层模型中的传输层。

传输层概述

        传输层的任务是为不同主机的进程之间的通信提供通用的数据传输服务。

        无论上层的应用层是什么样的网络应用如HTTP服务,FTP服务。当交付到传输层时,都可以使用同一种传输层协议为之提供服务。如上层的不同网络应用选择了UDP/TCP协议进行通信服务。则根据UDP/TCP协议,给不同的应用层数据添加相同格式的报头信息。当不同的网络应用数据传送到目的主机的传输层时,如果选择的是TCP协议,则会对这些不同的网络应用数据报进行相同模式的检错,出现错误,则进行重传,没有出现错误,则将这些数据交付给上层的不同网络应用程序。

        上述中不同的网络应用使用同一传输层协议:对上层交付的数据进行封装 或 解包交付给上层的不同进程,就称为传输层的通用服务。

        由上述:发送方传输层对上层的不同网络应用均使用同一传输层协议传送数据,就称为传输层的复用功能。接收方传输层根据数据报头中的信息将数据传送给上层的不同的应用进程,就称为传输层的分用功能。

        当网络中的两个主机进行数据通信时。从发送主机可能要通过多个不同的路由器最后将数据送至接收主机。这里要注意:只有主机的协议栈才有运输层,而路由器在转发分组时只用到下三层功能。站在IP层的角度来说,通信的双方是两个主机。它屏蔽了底层不同网络的差异,使得两主机认为直接在与对方进行通信。站在传输层的角度,通信的双方是不同主机中的不同进程。使得两进程认为在直接与对方进行通信。



        根据应用程序的不同需求,传输层有两种不同的传输层协议。下面将主要介绍这两种不同的协议。在介绍这两种协议之前,还需要先介绍之前提到过的端口号的相关概念。

端口号

        上述内容中有提到传输层的复用和分用功能。在发送端,应用层的不同进程的数据交付给传输层,由传输层的同一个协议统一处理;在接收端,传输层在根据同一协议将数据交付给应用层的不同进程。但是,当不同进程的数据向下交付时,如何来知道这些数据是由哪个进程交付下来的;当向上交付数据时,又要交给上层的哪个应用进程呢。所以,此时就需要为不同的应用进程设置一个标识,用于区分不同的应用进程。

        我们知道在单个计算机中,进程标识符可以唯一的标识一个进程。但在网络中进行数据传输时,由于计算机种类的不同,各计算机操作系统指定进程标识符的格式也不同。所以,不同计算机中的进程进行通信时,就需要指定一个统一的标准,来识别不同主机中的不同进程。

        在数据通信过程中,通信的终点是找到可以实现特定功能的进程。对同一程序开始执行后,就形成了一个进程1。当该进程1执行结束后,再次运行同一程序时,就形成了进程2。此时,这两个进程虽然执行的代码相同也就是实现的功能相同,但是却属于不同的进程。所以在对其进行标识时,并不是表示某一特定进程(如进程1或进程2分别进行标识),而是标识可以实现某一特定功能的进程(将进程1和进程2进行统一标识)。所以引入端口号的概念,用于标识可以实现某特定功能的进程。如为进程1和进程2均绑定一个端口号8080,当执行的是进程1时,根据8080找到的是进程1,当执行的是进程2时,此时8080找到的就是进程2。进程1和进程2有一共同点就是他们执行的是同一程序代码,也就是实现的功能相同。

        注意:

(1)上述所说的这种协议栈层间的协议端口称为软件端口。它是应用层的各种协议进程与传输层进行层间交互的一种地址。而硬件端口是不同硬件设备间交互的接口。

(2)端口号只具有本地意义。同一计算机中的不同端口号标识不同功能的进程。在网络中的不同计算机中,相同的端口号是没有关联的。不同计算机间进程用IP地址+端口号进行区分。

端口号的分类

        因为端口号只具有本地意义。也就是说一台计算机中最多可以运行多少进程,端口号的数量最多就可以制定这么多。所以操作系统底层用16位4字节大小来表示端口号,这样最多就可以表示65535个端口号。对于一台计算机中的进程数量来说,这个数字已经非常大了。

        当数据在网络中进行通信时,发起请求的一方称为客户端,处理请求的一方称为服务器端。当客户端向服务器发送请求时,需要知道服务器的IP地址(这里先不谈)和端口号来找到服务器进程。同样的,服务器返回响应时,也需要知道客户端的IP地址和端口号以找到客户端进程。所以,端口号分为:

1. 服务器端口号

        服务器端口号又分为:

(1)知名端口号(数值在0~1023)

        用于标识知名功能的协议进程。这些功能使用的应用层协议是众所周知的。如一个进程在应用层使用的是HTTP协议,该进程的功能就是提供万维网服务。所以将该进程绑定一端口号80。当客户端(浏览器)向指定IP地址的主机发出HTTP请求时,该主机便知道80号绑定的进程就是实现这种功能的。所以,就可以根据端口号80来知道服务器进程。因为该端口号是众所周知的处理HTTP请求的,所以,当客户端发出HTTP请求时(不加端口号),接受主机就会默认找到根据80端口找到指定进程。

        常见的知名端口号还有:

HTTPS服务器:443端口号

FTP服务器:21端口号

SSH服务器:22端口号

telnet服务器:23端口号

        这些知名端口号的意思是,比如要寻求指定IP主机中的文件传输服务,那一定找的是端口号为21的进程。要找端口号为22的进程,寻求的一定是远程连接服务。

(2)登记端口号(数值在1024~49151)

        如果我们自己编写了一个具备某特定功能的服务器,就可以在这个数值范围内申请一个端口号来绑定该服务器进程,此时,就会将该端口号与该进程之间的对应关系登记起来,以防止其他进程重复申请同一端口号。

        因为服务器是一直运行着的,是要给客户端提供服务的,所以它的端口号必须是众所周知的,这样客户端才能根据端口号找到该进程。如果服务器的端口号一直变,客户端每次都要根据不同的端口号去找服务器进程,这样做非常麻烦的。所以,一般都会将服务器进程绑定为一固定端口号以便客户端找到。

2. 客户端端口号(数值在49152~65535)

        客户端的端口号是由操作系统动态分配的。因为一个客户端在向服务发送完请求之后,收到回应之后,该客户端进程就终止了,它所对应的端口号也就不复存在了,这个端口号就可以给其他进程继续使用。当下次在运行时,可以为其分配新的端口号。因此为客户端指定固定的端口号是没有意义的,因为它不向服务器一样要一直运行,要被众所周知。

        根据如下命令,可以查看知名端口号:

cat /etc/services

        如下图:这里只列举部分


        注意:一个进程可以绑定多个端口号,但一个端口号只能绑定一个进程。



        当应用层将数据交付给传输层时,为了标识该数据是由哪个进程交付下来的以及要要付给目标主机的哪个应用进程。此时就需要对数据进行封装,给数据添加一个首部,用于记录源端口号和目的端口号等相关信息,这些都是传输层需要做的事情。而根据不同的用户需求,需要按照不同的协议来添加相应的信息。传输层共有两种协议:传输控制协议TCP和用户数据报协议UDP,下面先介绍UDP协议。

        传输层对数据报的称谓为段。

用户数据报UDP协议

        UDP协议的特点:

(1)UDP是无连接的。在知道对方的IP地址和端口后之后,直接传送数据。即在发送数据之前不建立连接,在接收数据之后也就不用释放链接,因此,节约了资源以及缩短了时间。

(2)UDP是不可靠的。它没有确认机制和重传机制。在接收端收到报文之后,不会向发送端反馈已经收到数据的消息。在数据传输过程中丢失了,也不会告诉发送端,使其进行重传。

(3)UDP是面向数据报的。发送方对应用层交付下来的数据在添加首部之后直接交给IP层。既不合并也不拆分,保留报文的边界。接收方接收到数据,也是整体交付给上层。因此,应用层在向下交付数据时要选用合适的大小。如果报文太长,到达IP层时,就会进行分片;如果报文太短,就会使首部相对于有效数据部分的比重太长,二者都会降低IP层的效率。

(4)UDP没有拥塞控制。当网络中发送拥塞时,发送方不会降低数据报的发送速度。这个特点适用于实时应用中,允许丢失部分数据,但不允许时间延迟。

(5)支持一对一,一对多,多对一,多对多的通信。

(6)UDP的首部只占8个字节,因此相对于TCP(20字节)的开销较小。

        UDP协议的首部示意图如下:


        其中:

16位源端口号:表示数据段的来自哪个发送进程

16位目的端口号:表示数据段要发送给哪个接收进程

16位的UDP报文长度:表示的是数据报头和有效数据共同的长度。

        因此UDP数据报所能传输的数据段长度是有限制的。最短为8字节,最长为2^16即64K。因此使用UDP协议传输数据时,要在应用层进行手动分包,多次传送,在接收端应用层进行手动拼装。

        在接收端的传输层接收到多个数据段之后,先根据数据报头中的数据长度知道第一个数据段的总长,因为数据报头是定长的,所以也就知道了该数据段的有效载荷。将8字节数据报头拆分之后,再根据有效载荷的长度选取有效载荷交付给上层。在利用同样的方法拆分第二个数据段,这样就能使所有的数据段区分开。因此,分离数据报头和有效载荷的方法是:使用定长报头。

16位的检验和:当接收端收到数据段之后,会对其报头和数据部分进行基本的检验,一旦出错,直接丢弃。不会向上层交付,也不会反馈错误信息。

        UDP的缓冲区

(1)UDP没有真正意义上的发送缓冲区,当应用层向UDP交付数据时,UDP对数据进行封装之后,直接交给IP层。

(2)UDP具有接受缓冲区。但是接受缓冲区不能保证收到的UDP报文和发送的UDP报文顺序一致。并且一旦接受缓冲区满了,后续到达的UDP报文会被直接丢弃。


参考文献:计算机网络(谢希仁)






        











猜你喜欢

转载自blog.csdn.net/sandmm112/article/details/80400470
今日推荐