当前位置:网站首页>传输层协议------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程序的时候在应用层自定义的协议。
边栏推荐
- ts类型声明declare
- Golang code checking tool
- 帶外和帶內的區別
- 【二叉搜索树】增删改查功能代码实现
- 98. 验证二叉搜索树 ●●
- 如何让同步/刷新的图标(el-icon-refresh)旋转起来
- What if the C disk is not enough? Let's see how I can clean up 25g of temp disk space after I haven't redone the system for 4 years?
- MySQL replace primary key delete primary key add primary key
- 《牛客刷verilog》Part III Verilog企业真题
- 14 MySQL-视图
猜你喜欢
CIS benchmark tool Kube bench
Open source CRM customer relationship system management system source code, free sharing
GFS distributed file system
如何获取localStorage中存储的所有值
跟着CTF-wiki学pwn——ret2libc1
Brushless drive design -- on MOS drive circuit
Rasa 3.x 学习系列-Rasa X 社区版(免费版) 更改
STM32__06—单通道ADC
开源crm客户关系统管理系统源码,免费分享
多普勒效应(多普勒频移)
随机推荐
【EF Core】EF Core与C# 数据类型映射关系
俄外交部:日韩参加北约峰会影响亚洲安全稳定
Convert Chinese into pinyin
Fiddler Everywhere 3.2.1 Crack
Open source CRM customer relationship system management system source code, free sharing
Biased sample variance, unbiased sample variance
同事悄悄告诉我,飞书通知还能这样玩
Latex multiple linebreaks
STM32__ 06 - single channel ADC
Spire.PDF for NET 8.7.2
【SQL】各主流数据库sql拓展语言(T-SQL 、 PL/SQL、PL/PGSQL)
Zero rhino technology joined hands with the intelligence Club: the "causal faction" forum was successfully held, and the "causal revolution" brought the next generation of trusted AI
CAS and synchronized knowledge
Senparc.Weixin.Sample.MP源码剖析
C# 反射与Type
How to get all the values stored in localstorage
上门预约服务类的App功能详解
2022.6.20-6.26 AI industry weekly (issue 103): new little life
20.移植Freetype字体库
Bao Yan notebook IV software engineering and calculation volume II (Chapter 8-12)