运输层协议之TCP UDP

因特网为应用程序提供两个运输层协议。即TCP/UDP。当你对因特网创建一个新的应用时,首先要做出的决定是,选择UDP还是TCP。每个协议为调用他们的应用程序提供了不同的服务集合。如图所示


接下来对这两种传输方式进行介绍

1.TCP服务

TCP服务模型包括面向连接的服务和可靠数据传输服务。当某个应用程序调用TCP作为其运输协议时,该应用程序就能获得来自TCP的两种服务。

    面向连接的服务:在应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息。这个所谓的握手过程提示客户和服务器,使他们为大量分组的到来做好准备。在握手阶段后,一个TCP连接就在两个进程的套接字之间建立了。(套接字可以看做是接口或者连接建立的门口)这条连接是全双工的,即连接双方的进程可以在此连接上同时进行收发报文。当应用程序结束报文发送时,必须拆除该连接。

    可靠的数据传送服务:通信进程能够依靠TCP,无差错,按适当顺序交付所有发送的数据。当应用程序的一端将字节流传入套接字时,它能够依靠TCP将相同的字节流交付给接收方的套接字,没有字节的丢失和冗余。

2.UDP服务

UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务,UDP是无连接的,因此在两个进程通信前没有握手过程。UDP协议提供一种不可靠的数据传输服务,也就是说,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达接收进程。不仅如此,到达接收进程的报文可能是乱序到达的。

二者还有一个区别就是拥塞控制问题,TCP协议还具有拥塞控制机制,但是这里我想重新开一篇文章详细叙述拥塞控制。拥塞控制机制不一定能为通信进程带来直接好处,但是能为因特网带来整体好处。当发送方和接收方之间的网络出现拥塞时,TCP的拥塞控制机制会抑制发送进程(客户或服务器)。而UDP没有拥塞控制机制,所以UDP的发送端可以用它选定的任何速率向其下层(网络层)注入数据。

常用服务的传输协议分类


3.套接字编程

    典型的网络应用是由一对程序(即客户程序和服务器程序)组成的,他们位于不同的端系统中。当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时他们通过套接字读出和写入数据彼此之间进行通信,开发者创建一个网络应用时,其主要任务就是编写客户程序和服务器程序的代码。

扫描二维码关注公众号,回复: 1780952 查看本文章

    在研发阶段,开发者必须最先做的一个决定是,应用程序是运行在TCP上还是运行在UDP上。前面讲过TCP是面向连接的,并且为两个端系统之间的数据流动提供可靠的字节流通道。UDP是无连接的,从一个端系统向另一个端系统发送独立的数据分组,不对交付提供任何保证。

    3.1UDP套接字编程

        运行在不同机器上的进程彼此通过套接字发送报文来进行通信,我们将每个进程比作是一个房子,该进程的套接字好比是一扇门。应用程序位于房子中门的一侧,运输层位于该门朝外的另一侧。应用程序开发者在套接字的应用层一侧可以控制所有东西,然而,他几乎无法控制运输层一侧。在UDP套接字的两个进程之间的交互过程中,在发送进程能够将数据分组退出套接字之门之前,使用UDP时,必须先将目的地址附在该分组之上,在该分组传过发送方的套接字之后,因特网将使用该目的地址通过因特网为该分组选路到接收进程的套接字。当该分组到达接收套接字时,接收进程将通过套接字取回分组,进而检查分组的内容并采取适当的动作。
    在UDP分组上附上目的地址,目的地址包含了目的主机的IP地址和套接字的端口号。通过在分组中包括目的地址的IP地址,因特网中的路由器能够通过因特网的分组选路到目的主机,但是因为一台主机可能运行许多网络应用进程,每个进程具有一个或多个套接字,所以在目的主机指定的套接字也是必要的。当生成一个套接字时,就为它分配一个称为端口号的标识符。因此,发送进程为分组附上的目的地址是由目的主机的IP地址和目的地址套接字的端口号组成的。发送方的原地址也是由源主机的IP地址和源套接字的端口号组成。

3.2 TCP套接字编程

    与UDP不同,TCP是一个面向连接的协议,这意味着客户和服务器能够开始互相发送数据之前,他们先要握手和创建一个TCP连接。TCP的一端与客户套接字相联系,另一端与服务器套接字相联系。当创建该TCP连接时,我们将其与客户套接字地址和服务器套接字地址关联起来。使用创建的TCP连接,当一侧要向另一侧发送数据时,它只需要经过其套接字将数据丢给TCP连接。这与UDP不同,UDP服务器在将分组丢进套接字之前必须附上目的地址。

    TCP中客户程序和服务程序的交互,可以简单总结为三次握手。

    客户具有向服务器发起接触的任务。第一,TCP服务器在客户试图发起接触前必须作为进程运行起来。第二,服务器程序必须具有一扇特殊的门,更精确的说是一个特殊的套接字,该门欢迎来自运行在任意主机上的客户进程的某些初始接触。使用房子/门来比喻进程/套接字,有时我们将客户的初始接触称为敲开欢迎之门。

    随着服务器进程的运行,客户进程能够向服务器发起一个TCP连接。这是由客户程序通过创建一个TCP套接字完成的。当该客户生成其套接字时,它指定了服务器中的欢迎套接字地址,即服务器主机的IP地址及其套接字的端口号。生成其套接字后,该客户发起了一个三次握手并创建于服务器的一个TCP连接。发生在运输层的三次握手,对于客户和服务器程序时完全透明的。

    在三次握手期间,客户进程敲服务器进程的欢迎之门,当该服务器“听”到敲门时,它将生成一扇新门(更精确的讲是一个套接字),它专门用于特定的客户。它专门对客户进行连接的新生成的套接字,称为连接套接字。


从应用程序的观点来看,客户套接字和服务器套接字直接通过一根管道连接。如图所示,客户进程可以向它的套接字发送任何字节,并且TCP保证服务器能够按发送顺序接收每个字节。TCP因此在客户和服务器之间能够提供共可靠服务。

猜你喜欢

转载自blog.csdn.net/q_all_is_well/article/details/80722565
今日推荐