当前位置:网站首页>传输层协议------UDP协议
传输层协议------UDP协议
2022-07-05 23:40:00 【梳碧湖的敲键人】
传输层
再谈端口号
1.作用:其实就是一个标识符,用来区分应用层中不同的进程。
但是在通信中,端口号非常重要。一个五元组信息是通信中必备的信息,而端口号就占了两个,一个通信的成功进行,五元组必不可少,所以对于源端端口号和对端端口号都必须知道。
2.端口号的表示:端口号的表示是用16个比特位进行标识的,也就是2个字节,标识的范围为0~65535。
其中:对于不同的区间有着不同的划分。
- 熟知端口号:0~1023。在IANA(互联网地址编码分配机构)将这些端口号指派给了TCP\IP体系结构中一些重要的应用协议。(例如:FTP协议的端口号为20/21,HTTP协议的端口号为80,HTTPS协议的端口号为443,DNS协议的端口号为53等等很多)
- 登记端口号:1024~49151。为没有熟知端口号的应用程序使用。而如果要使用这些端口号,就必须在IANA上去按照规定的手续去登记,防止混用了。
- 短暂端口号:49152~65535。留给客户进程短暂使用的。当一个客户进行通信的时候,系统会自动在这段数据中去给客户分配一个未被使用的端口号(这也就是前面我们进行tcp套接字编程和udp套接字编程的时候,并没有通过给客户端绑定端口号的原因)。当服务器进程收到客户进程发送的报文的时候,就知道了客户进程所使用的动态端口号。而通信结束后,这个端口号就可以给其他客户进行以后使用。
注意:端口号只具有本地意义,只是为了标识本计算机的应用层的各进程,而在因特网中,不同的计算机中相同的端口号是没有关系的。
3.除了端口号,其实还有个协议号
通过上图,可以看出来,ip首部除了源ip地址和目标ip地址以外,还有一个TCP6,而这个TCP6中的6就是TCP的协议字段。(即,6就是tcp的协议号)
而对于UDP协议,它的协议号其实是17。
通过上图可以看出来,端口号在ip段就不见了,而在tcp数据报中就有了,所以对于端口号是存在于应用层和传输层之间,而对于协议号,是存在于传输层和网络层之间。
4.发送方的复用和接收方的分用
如下图:
其中:对于图来说,左边为发送方,右边为接收方,发送方根据所发送的的协议对数据进行复用,而接收方根据接收到的数据有进行分用,最后得到自己要得到的结果。
认识知名端口号
上面,已经介绍了一些知名端口号,其实还有很多,许多我们经常使用的端口号如下:
- ssh服务器:22端口
- ftp服务器:21端口
- telnet服务器:23端口
- http服务器:80端口
- https服务器:443端口
还有很多,我们可以通过这个命令去查询知名端口号:cat/etc/services
查询结果如下:
所以,如果我们要编写一个程序使用到端口号时,应该尽可能的去避免使用人家已经固定的端口号,防止冲突的产生。
两个问题
1.一个进程可以bind多少端口号呢?
答:一个进程是可以绑定多个端口号的。
原因:由于一个进程中可以打开多个文件描述符,而每个文件描述符都对应一个端口号,所以一个进程可以绑定多个端口号。
2.一个端口号是否可以被多个进程bind呢?
答:一个端口号不可以被多个进程绑定。即:一个端口号只能被一个进程绑定。(但是上述也有特殊点,就是一个父进程它绑定了一个端口号,但是他又fork了一个子进程出来,这个子进程就也拥有这个端口号。所以这样就实现了多个进程绑定同一个端口号。但是,不是父子进程的不同进程,是绝对不可能绑定同一个端口号)
原因:由于端口号的绑定只是发生在服务器上,一般情况下,服务器有多个端口,而一个端口只会对应一个服务。而多数情况下(除了上面说的父子进程的例外),一个服务对应一个进程,不存在两个进程同时为给一个端口号进行服务。
netstat和pidof
1.netstat命令
①:语法:netstat [选项]
②:功能:查看网络状态。
常用选项:
- -n:拒绝显示别名,能显示数字的全部转化为数字。
- -l :仅列出有LISTEN(监听的)服务状态。(基于TCP通信)
- -p:显示建立相关连接的程序名。
- -t :仅显示tcp相关选项。
- -u:仅显示udp相关选项。
- -a:显示所有选项,默认不显示LISTEN相关的。
使用例子如下:
查看tcp进程
查看udp进程如下:
其中:上图中
①Proto:表示的是协议类型。
②Local Address:表示的是源端ip地址和源端端口号。
③Foreign Address:表示的是目的端ip地址和目的端口号。
④State:表示的是当前建立的状态。
3.pidof命令
①语法:pidof [进程名]
。
②功能:通过进程名查看id。
例如:
上图,通过bash,查看到了它们的pid号。
UDP协议
UDP协议段格式
请看下图:
为一个udp用户数据报的模拟图,其中udp首部所占用的字节为8字节,并且包含有四个成分:源端口,目的端口,长度,检验和。每个占有2个字节。
其中:
- 源端口:数据从哪里来。
- 目的端口:数据要到那里去。
- 长度:数据的长度。(整个数据报包含首部)
- 检验和:如果udp的报文检验和出错,就会丢弃报文。
在内部的结构体如下:
表示的就是这四部分。
UDP的特点
UDP传输的过程,类似于寄信,所以大概有如下特点:
1.无连接:通信双方在进行通信的时候,不需要建立连接(只需要知道彼此的地址就好),直接发送数据就可以了。(就类似与寄信一样,我只知道你的地址,我就可以给你寄信)
2.支持一对一,一对多,多对一和多对多的交互通信:使用udp协议的局域网中,任何一台主机都可以向其他主句发送广播信息(就是该局域网中的所有主机都可以接收到),也可也向其中一个多播组发送多播(多播组就是同一局域网下的几台主机组成的一个小组),也可也向其中一台主机发送单播。
3.对应用层交付的报文直接打包:发送方给传输层发的数据报,使用UDP协议会直接给其加上一个UDP首部就进行发送了。
注意:
- 应用层交给UDP多长的数据,udp既不会拆分,也不会合并,直接加上udp首部然后直接发送。
- 如果发送端调用一次sendto,而一次发送的是100个字节。那么对应端也应该只调用一次recvfrom,一次接收100个字节,而不是循环十次,每次接收10个字节。
- 我们注意到,在上面我们讲过,使用了两个字节去保存一个udp数据报的长度,那么一个udp数据报的最大字节长度就是64k,并且其中还包含有首部。所以,对于数据部分,我们传输的时候,尽量小于64k,如果我们要传输的数据大于64k,那么就需要在应用层进行手动分包,多次发送,并且在接收端手动拼装。(基于严格的整条传输,也就是如果说接收方的缓冲区太小,容不下发送方发出的数据,那么这个数据必然会被丢弃)
4.尽最大努力交付,也就是不可靠:若传输的过程中,用户数据报收到干扰而产生误码,接收方会根据udp头部字段校检信息,检查误码的状况,若出现误码,侧仅丢弃该数据报,并其他什么都不会做(因为没有重传机制,也没有确认机制)。
这样和udp的缓冲区有关:
- udp没有真正意义上的缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。
- udp具有缓冲区,而这个缓冲区的作用不能保证收到的udp报顺序和发送的udp报顺序一致,并且如果这个缓冲区满了,那么后面来的报就会被丢弃。
- udp的socket,不仅可以读,还可以写,是一个全双工通信socket。
其中:udp的检验和检错方法是二进制求和算法。
二进制求和算法:
①:发送方组织好数据,将首部字段的检验和位置为0,然后从第0个字节(包含首部,就是首部第一个字节)开始对每个字节开始取反求和,超出16位的,则就将高位截断后,让其与低16位继续求和。
②:完成后将校验和填充到检验和字段中。
③:接收方收到数据,将数据从头到尾进行反码求和,这时候,如果数据是正确无误的,那么最后的结果应该是0。
UDP对应应用层的协议
- NFS:网络文件系统。
- TFTP:简单文件传输协议。
- DHCP:动态主机配置协议。
- BOOTP:启动协议。(用于无盘设置启动)
- DNS:域名解析。
当然,也包含你自己去写udp程序的时候在应用层自定义的协议。
边栏推荐
- Neural structured learning - Part 2: training with natural graphs
- 20. Migrate freetype font library
- CloudCompare&PCL 点云随机添加噪声
- 【GYM 102832H】【模板】Combination Lock(二分图博弈)
- Naoqi robot summary 26
- Objective C message dispatch mechanism
- The use of El cascader and the solution of error reporting
- 妙才周刊 - 8
- Fiddler Everywhere 3.2.1 Crack
- UVA11294-Wedding(2-SAT)
猜你喜欢
STM32__06—单通道ADC
18.(arcgis api for js篇)arcgis api for js点采集(SketchViewModel)
Dynamic planning: robbing families and houses
Research notes I software engineering and calculation volume II (Chapter 1-7)
保研笔记四 软件工程与计算卷二(8-12章)
"14th five year plan": emphasis on the promotion of electronic contracts, electronic signatures and other applications
C reflection and type
零犀科技携手集智俱乐部:“因果派”论坛成功举办,“因果革命”带来下一代可信AI
用列錶初始化你的vector&&initializer_list簡介
Neural structured learning - Part 2: training with natural graphs
随机推荐
Open source CRM customer relationship system management system source code, free sharing
Comparison of parameters between TVs tube and zener diode
《牛客刷verilog》Part III Verilog企业真题
Redis high availability - master-slave replication, sentinel mode, cluster
Naoqi robot summary 26
用列錶初始化你的vector&&initializer_list簡介
STM32__06—单通道ADC
Qcombox (rewrite) + qcompleter (auto completion, auto loading the drop-down options of qcombox, setting the background color)
保研笔记一 软件工程与计算卷二(1-7章)
GFS分布式文件系統
如何让同步/刷新的图标(el-icon-refresh)旋转起来
In C#, why can't I modify the member of a value type instance in a foreach loop?
Senparc.Weixin.Sample.MP源码剖析
698. Divided into k equal subsets ●●
PV静态创建和动态创建
上门预约服务类的App功能详解
When to use useImperativeHandle, useLayoutEffect, and useDebugValue
Initialiser votre vecteur & initialisateur avec une liste Introduction à la Liste
动态规划 之 打家劫舍
424. The longest repeated character after replacement ●●