目录
传输层
端口号
端口号和进程的关系
UDP协议
UDP协议格式
UDP数据封装:
UDP数据分用:
面向数据报
UDP的缓冲区
UDP的缺点
基于UDP的应用层协议
传输层
端口号
我们知道端口号对应的其实就是一个进程的pid,在操作系统中二者的对应关系用的是hash进行存储的。即我们可以通过端口号找到对应的进程。
而对于我们的服务器来说,在接收到发送端的数据时,这时要传给哪个应用(进程)是通过端口号来确认的
这个工作就是传输层要做的事:把数据交给应用层,和从应用层中获取数据传出(封装报头)
怎么标识一个通信
源IP地址,目标IP地址,源端口号,和目标端口号,协议号。这5个号来标识一个信息的来去地方。 IP地址标记是哪台主机,端口号标记是哪个程序,协议号标记用的是什么协议(TCP,UDP协议)。
netstat命令可以找到查看网络信息,即上面的5个号
proto协议:表示使用的什么协议。local address本地地址:源IP地址和源端口号,foreign address 就是目标地址和目标端口号了。
协议号和端口号
协议号是网络层的范畴,端口号是传输层协议的范畴 。
因为我们传输层会选择传输协议:UDP TCP协议,所以协议号,可以让我们知道数据需要什么协议来接收。从网络层传到传输层。
而端口号,就是在我们协议处理好数据后,把数据传给对应的程序。从传输层传到应用层。
端口号的范围
端口号的长度是16位,2的16次方,切换位整数就是 0 - 65535.
- 0 - 1023:知名端口号,比如HTTP,FTP,SSH等广为使用的应用层协议,他们的端口号都是固定的。
- 1024 - 65535:操作系统动态分配的端口号,也可以自己指定,操作系统自动分配(客户端),软件自己指定(服务器软件)。
知名端口号有哪些?
- ssh服务器,使用22端口。
- ftp服务器,使用21端口。
- telnet服务器,使用23端口。
- http服务器,使用80端口。
- https服务器,使用443端口。
当然不止这些,可以去/etc/services文件中查看
端口号和进程的关系
1.一个端口号只能和一个进程产生联系。
2.一个进程可被多个端口号绑定。
一个端口号只能和一个进程产生联系,因为端口号是要标识唯一的一个进程。
一个进程可被多个端口号绑定,进程本来就是唯一的,端口号表示唯一的一个进程,所以多个端口号可以绑定同一个进程
UDP协议
UDP协议格式
网络套接字中使用的socket接口,都是位于应用层和传输层之间的,应用层把数据准备好,传输层要开始把数据包装(绑定端口号),比如说HTTP他是应用层的协议,它的传输层协议用的是TCP协议,应用层函数中是可以指定使用的传输层协议的。
只有应用层的逻辑代码是应用程序员写的,再往下开始就是操作系统的范畴了,所以UDP是属于内核中的,是操作系统本是就带着的,代码逻辑用户不用写。
UDP协议格式
端口号不用介绍了。
UDP长度:这里指的就是数据的大小。
UDP校验和:如果检验和出错,报文将会被直接丢弃
UDP的报头和有效载荷(数据)怎么分离
很简单,我们已经知道报头有8字节,我们只要把8字节拿掉剩下的就是有效载荷(数据)了。 这里也可以看出来UDP的数据是定长的,因为定了UDP长度。
UDP如何决定把数据给上层哪个协议
就是通过目标端口号,在把数据传上去给对应的进程。
应用层的每一个网络进程都会绑定端口号,服务器必须显示绑定一个端口号,就是用户自己定的。而客户端的端口号,是操作系统分配的(所以在你使用软件时你不用输入端口号)。
怎么理解报头
报头就是一个结构体,里面存储了4个信息,取用时就根据比特位取用即可
UDP数据封装:
1.把端口号 等信息创建一个报头结构体对象,然后填充进去初始化。报头就组装好了。
2.在操作系统中,给数据和报头单独开一块连续的空间,然后这就时一个UDP封装了。
UDP数据分用:
UDP传输数据分用 就是短信,寄信的类似过程:(TCP是类似打电话的样子,双方要有连接)
- 无连接:即UDP只管发,不管回信。所以不用连接
- 不可靠:我们把信发出去后,我们并不知道信是否送达,也不确定是否有回信。
- 面向数据报:大白话就是,定长的数据报头数据大小指定多少发多少。封装好就直接发送。
面向数据报
应用层给多少,我们的UDP一次就发多少,不会一次发多个而是一个一个的发送,不拆分也不合并,每次发送都是一个整体。
UDP的缓冲区
1.UDP没有发送缓冲区,sendto发送时到了传输层,就直接发送。
2.UDP有接收缓冲区,因为发送是保证发出的,但接收是不保证的,如果你发送的很快很多,如果没有缓冲区那很多信息就没了。
3.UDP既能读也能写所以是全双工的。
UDP的缺点
1.UDP的传输大小是16位,2的16次方 == 64Kb,所以UDP一次最多能传64kb。
2.在现在64kb真的太小了。所以超过64kb就要对数据进行拆分发送了。
基于UDP的应用层协议
- NFS:网络文件系统。
- TFTP:简单文件传输协议。
- DHCP:动态主机配置协议。
- BOOTP:启动协议(用于无盘设备启动)。
- DNS:域名解析协议。
你在用socket编程时也可以自己指定用TCP还是UDP。