TCP/IP五层模型——传输层(端口号、UDP协议)

应用层:负责数据能够从发送端传输到接收端

一. 端口号

1. 概念

        我们知道端口号标识了一台主机上进行通信的一个的应用程序。在TCP/IP协议中,我们用“源IP”、“源端口号”、“目的IP”、“目的端口号”、“协议号”这样一个五元组来标识一个通信(可以通过netstat -n 查看)。

        这里要注意的是,我们所谈的端口号为网络协议栈上用来唯一的标识一个进程,是软件端口;端口号具有本地意义,也就是说,在网络中,不同主机上的同一端口号之间并无关联。

2. 端口号的划分

(1)0-1023:知名端口号,用以标识知名功能的协议进程。比如HTTP对应80,SSH对应22等广为应用的应用层协议的端口号都是固定的。

(2)1024-65535:这部分为操作系统动态分配的端口号,客户端程序的端口号,就从这个范围内分配。

要注意,我们在自己编写程序使用端口号时,要避开这些知名端口号

3. 知名端口号的了解

    SSH服务器:22

    FTP服务器:21

    telnet服务器:23

    HTTP服务器:80

    HTTPS服务器:443

执行下面命令,可以看到知名端口号:

cat /etc/services

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


二. UDP协议

1. UDP协议端格式

TCP/IP五层模型——传输层(端口号、UDP协议)_第1张图片

其中:

(1)16位源端口号:标识报文来自哪个进程

(2)16位目的端口号:标识报文要发送给哪个进程

(3)16位UDP长度:用以标识整个UDP报文的长度,即UDP首部+UDP数据的最大长度;

(4)16位UDP的校验和:用以检验数据是否出错,一旦检验和出错,直接丢弃,不会向上层交付信息,也不会返回错误信息。

2. UDP的特点

(1)UDP无连接。知道对端的IP地址以及端口号之后就可以直接进行数据传输,不需要建立连接;

(2)UDP不可靠。UDP没有确认和重传机制,在接收端接收到数据之后不会向发送端发送确认信息,因为数据丢失导致接收端并未收到数据,发送端也不知道,也不会重传,这就无法保证可靠;

(3)UDP面向数据报。发送方在发送报文时,要么不发,要发就要发整个报文,不能拆分来发,接收方在接收报文时要么不收,要接受就要接收整个报文。也就是说,应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并;

(4)UDP支持一对一、一对多、多对一、多对多的通信。

比如,用UDP传输100个字节的数据:

        如果发送端调用一次sendto,发送100个字节,那么接收端也必须调用对应的一次recvfrom,接收100个字节。而不能循环调用10次recvfrom,每次接收10个字节。

3. UDP的缓冲区

(1)UDP没有真正意义上的发送缓冲区。调用sendto时会直接交给内核,由内核直接将数据传给网络层协议进行后续的传输动作;

(2)UDP具有接收缓冲区。但是这个接收缓冲区不能保证收到的UDP报文的顺序与发送端发送的UDP报文的顺序一致;且若缓冲区满了,再到达接收缓冲区的数据就会被直接丢弃。

UDP的socket既能读,又能写,这个概念叫做全双工。这里的读和写值得是通信的双方能够同时进行读写。

4. UDP的注意事项

(1)因为UDP协议首部中有一个16位的最大长度,即一个UDP能传输数据的最大长度是2^16=64K(包含UDP首部);能传输数据的最小长度为8字节,即无数据,仅有首部信息;

(2)所以当我们用UDP要传输的数据超过64K时,就需要在应用层手动地分包,多次发送,并在接收端进行拼装。

5. 基于UDP的应用层协议

    NFS:网络文件系统

    TFTP:简单文件传输协议

    DHCP:动态主机配置协议

    BOOTP:启动协议(用于无盘设备启动)

    DNS:域名解析协议

当然,还有自己编写时定义的UDP协议。




你可能感兴趣的:(Linux)