网络原理考点之UDP与TCP套接字分配问题

自考的真题,做了一份近代史的,又做了份网络原理的。网络的简答题和应用题,占65分,可以说掌握这些,那么网络原理必过。

2019年10月份04741简答题1

简述为UDP套接字分配端口号的两种方法:

答:很具迷惑性,查了教材,UDP(117页)也没有论述,只是讲了报文的格式。

看了网友给我的回复,在第103页,确实是明确给出了答案

虽然之前没找到答案,但以下的东西,也不是没有,就当作扩展吧!!

主体知识参见1-20日网络原理之传输层,其实也没有讲如何分配端口;并且还是套接字分配端口,带着这两个疑问?其实题意无非就是说如何分配端口,因为套接字(socket)里面详见教材85页,倒是讲了几个函数,据此可以推测,这里应该是考察函数(方法)。

就这个题而言,写这两个方法就够了。

扩展:

地址信息的表示

从上面的函数可以知道,一个地址信息应该包括地址族+IP地址+端口号,下面来看看程序里表示它们的结构体:

//标准结构体
struct sockaddr
{
    sa_family_t   sin_family;//地址族
    char          sa_data[14];//地址信息(IP地址和端口号)
}
//扩展结构体
struct sockaddr_in
{
    sa_family_t      sin_family; //地址族
    uint16_t         sin_port;   //端口号
    struct in_addr   sin_addr;   //IP地址
    char             sin_sero[8]; //不使用
}

struct in_addr
{
    In_addr_t    s_addr;   //4字节IPv4地址
}

说明:函数bind()或connect()第二个参数要求传入sockaddr结构体类型数据,但从上面可以看出这种结构体初始化数据不方便,所以就有了对sockaddr结构体的扩展sockaddr_in。sockaddr不仅仅只为IPv4设计,所以它要手动指定地址族,而它的扩展sockaddr_in则仅为IPv4设计的,不过它还是需要指定地址族(虽然已经知道),而且还需要加空数组,就是为了和sockaddr结构保持一致。

端口号是什么作用呢?

IP用于区分计算机,只要有IP地址就能向目标主机传输数据,但仅凭这些无法把数据传输给最终的应用程序。因此,端口就是用来指定是与哪个应用程序进行通信

TCP与UDP报文段结构中端口号都是16比特,可以有在0---65535范围内的端口号。对于这65536个端口号有以下的使用规定:

(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1---1023之间的端口号(周知端口号),是由ICANN来管理的;

(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;

(3)大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。大于5000的端口号是为其他服务器预留的。

多路复用与多路分解

一个进程(作为网络应用的一部分)有一个或多个套接字(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连接使用。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值