网络基础:传输层(端口号、UDP协议)

传输层:负责数据能够从发送端传输至接收端
之前我们提到过端口号(Port)标识了一个主机上进行通信的不同的应用程序。
网络基础:传输层(端口号、UDP协议)
由图我们可以看出如果想要数据成功的发送出去。那么我们就必须让他知道IP地址和端口号。就像我们要找一个人,我们只知道他住哪个小区是不够的,我们还需要知道他在这个小区的哪一个房。他的房号就确定了一个具体的地址,并且是唯一的一个地址,不可能给一个房号我们能找到两个房,如果能找到两个房那到底哪个房间里的人才是我们要找的呢?同理,数据发送的时候指定的端口号也必定唯一的表示了一个应用程序,数据才能确定他应该去哪儿。

端口号范围划分:
0~1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的。
1024~65535:操作系统动态分配的端口号,客户端程序的端口号就是由操作系统从该范围内分配的。
了解知名端口号:
ftp服务器:21端口
ssh服务器:22端口
telnet服务器:23端口
http服务器:80端口
https服务器:443端口
注意:当我们自己在写一个程序时如果要用到端口号就要避开这些知名端口号。
我们也说了一个端口号唯一标识一个进程,所以我们的一个端口号是不能同时被多个进程绑定的,如果同时被多个进程绑定,那我们知道端口号以后到底去找哪一个进程呢?这个时候就说不清了。所以一个端口号只能被一个进程绑定。但是反过来一个进程是可以绑定多个端口号的,因为这并不影响我们通过端口号唯一确定一个进程。

在TCP/IP协议中,用 ‘源IP’ , ‘源端口号’ , ‘目的IP’ , ‘目的端口号’ , ‘协议号’。这样一个五元组来标识一个通信(可以通过netstat -n查看)。这里的‘源IP’和‘源端口号’是源端套接字,‘目的IP’和‘目的端口号’是客户端套接字。
网络基础:传输层(端口号、UDP协议)
网络基础:传输层(端口号、UDP协议)
UDP协议:用户数据报协议
udp协议端格式:
网络基础:传输层(端口号、UDP协议)

16位udp长度:表示整个数据报(udp首部+udp数据)的最大长度。
如果校验和出错就会直接丢弃。

我们在之前说过一个数据包的分用过程,而数据报在自底向上的交付过程中是一对多的,那么又是如何准确的将数据一一正确交付的呢?数据报在向上交付的过程中是根据报头中的有效载荷从而确定需要将数据交付给上一层的谁。而有效载荷是在报文中的,我们又如何才能取到有效载荷呢?此时我们就需要将报头和有效载荷。

分离报头和有效载荷的方法:
1、使用定长的报头。丢弃报头(这里就是8个字节),剩下的就是有效载荷。
2、拿出整体报文,再去掉定长报头,剩下的就是有效载荷。

udp特点

特点 描述
无连接 知道对端的IP和端口号就直接进行传输,无需建立连接
不可靠 没有确认机制和重传机制,若因为网络故障该段无法发给对方,udp协议层不会给应用层返回任何消息
面向数据报 不能够灵活的控制读写数据的次数和数量

由于udp协议面向数据报的特点:所以我们应用层交付给udp的报文,无论这个报文有多长或者多短,udp都只会原样发送,不会做任何的拆分也不会进行合并。也就是说一个很长的报文必须一次传送(不会拆分),传送完毕以后对端也必须一次接受完毕(不能一次接收一部分,分多次接收完成)。多个很短的报文也必须分多次传送(不会合并)。总结一下就是:udp对于数据的收发从来都是整发整收。

UDP的缓冲区:

udp没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
udp具有接收缓冲区,但是这个接收缓冲区不能保证收到的udp报的顺序和发送udp报的顺序一致,如果缓冲区满了在到达的udp数据报就会被丢弃。

udp使用注意事项:

udp协议首部中有一个16位的最大长度,也就是说一个udp能传输的数据的最大长度是64K(包含udp首部)。然而64k在当今的互联网环境下就是一个非常小的数字。如果我们要传输的数据超过了64k就需要在应用层手动的进行一个分包的过程,分多次发送并在接收端手动的进行拼接。

应用层有很多的协议都是基于udp实现的:
DNS:域名解析协议
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)