传输层协议------UDP协议

传输层

再谈端口号

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程序的时候在应用层自定义的协议。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值