Linux网络编程——UDP


宗旨:技术的学习是有限的,分享的精神是无限的。


下面分析一帧基于UDP的TFTP协议帧。

以太网首部

0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00

IP首部0000: 45 00

0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8

0020: 00 01

UDP首部

0020: 05 d4 00 45 00 3f ac 40

TFTP协议

0020: 00 01 'c'':''\''q'

0030: 'w''e''r''q''.''q''w''e'00 'n''e''t''a''s''c''i'

0040: 'i'00 'b''l''k''s''i''z''e'00 '5''1''2'00 't''i'

0050: 'm''e''o''u''t'00 '1''0'00 't''s''i''z''e'00 '0'

0060: 00

以太网首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上层协议类型0x0800表示IP。

IP首部:每一个字节0x45包含4位版本号和4位首部长度,版本号为4,即IPv4,首部长度为5,说明IP首部不带有选项字段。服务类型为0,没有使用服务。 16位总长度字段(包括IP首部和IP层payload的长度)为0x0053,即83字节,加上以太网首部14字节可知整个帧长度是97字节。 IP报标识是0x9325,标志字段和片偏移字段设置为0x0000,就是DF=0允许分片, MF=0此数据报没有更多分片,没有分片偏移。 TTL是0x80,也就是128。上层协议0x11表示UDP协议。 IP首部校验和为0x25ec,源主机IP是c0 a8 00 37( 192.168.0.55),目的主机IP是c0 a8 0001( 192.168.0.1)。

UDP首部:源端口号0x05d4( 1492)是客户端的端口号,目的端口号0x0045( 69)是TFTP服务的well-known端口号。 UDP报长度为0x003f,即63字节,包括UDP首部和UDP层payload的长度。 UDP首部和UDP层payload的校验和为0xac40。

TFTP是基于文本的协议,各字段之间用字节0分隔,开头的00 01表示请求读取一个文件,接下来的各字段是:

c:\qwerq.qwe

netascii

blksize 512

timeout 10

tsize 0

一般的网络通信都是像TFTP协议这样,通信的双方分别是客户端和服务器,客户端主动发起请求(上面的例子就是客户端发起的请求帧),而服务器被动地等待、接收和应答请求。客户端的IP地址和端口号唯一标识了该主机上的TFTP客户端进程,服务器的IP地址和端口号唯一标识了该主机上的TFTP服务进程,由于客户端是主动发起请求的一方,它必须知道服务器的IP地址和TFTP服务进程的端口号,所以,一些常见的网络协议有默认的服务器端口,例如HTTP服务默认TCP协议的80端口, FTP服务默认TCP协议的21端口, TFTP服务默认UDP协议的69端口(如上例所示)。在使用客户端程序时,必须指定服务器的主机名或IP地址,如果不明确指定端口号则采用默认端口,请读者查阅ftp、 tftp等程序的man page了解如何指定端口号。 /etc/services中列出了所有wellknown的服务端口和对应的传输层协议,这是由IANA( Internet Assigned Numbers Authority)规定的,其中有些服务既可以用TCP也可以用UDP,为了清晰, IANA规定这样的服务采用相同的TCP或UDP默认端口号,而另外一些TCP和UDP的相同端口号却对应不同的服务。

UDP协议不面向连接,也不保证传输的可靠性,例如:

发送端的UDP协议层只管把应用层传来的数据封装成段交给IP协议层就算完成任务了,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。

接收端的UDP协议层只管把收到的数据根据端口号交给相应的应用程序就算完成任务了,如果发送端发来多个数据包并且在网络上经过不同的路由,到达接收端时顺序已经错乱了,UDP协议层也不保证按发送时的顺序交给应用层。

通常接收端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用程序来提取和处理,如果应用程序提取和处理的速度很慢,而发送端发送的速度很快,就会丢失数据包, UDP协议层并不报告这种错误。

Linux C高级编程——网络编程之UDP(4)相关推荐

  1. Linux C高级编程——网络编程之TCP(3)

    Linux网络编程(三)--TCP 宗旨:技术的学习是有限的,分享的精神是无限的. 1.TCP段格式 和UDP协议一样也有源端口号和目的端口号,通讯的双方由IP地址和端口号标识.32位序号.32位确认 ...

  2. Linux C高级编程——网络编程之API(5)

    Linux C网络编程--API 宗旨:技术的学习是有限的,分享的精神的无限的.          一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的so ...

  3. Python中的网络编程之UDP

    Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...

  4. 萌新解--Java网络编程之UDP

    Java网络编程之UDP UDP协议为无连接的通信协议,在传数据前发送端与接收端不会先建立连接,也就是你发我就收但不一定会收到哦,以我们自身为发送端,我们不会事先让接收方知道我要给接收方发数据啦.就像 ...

  5. Linux C高级编程——网络编程基础(1)

    Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是因为TCP/IP包含T ...

  6. 1.6 网络编程之 UDP通信

    ************************************************** * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站:蓝丽 ...

  7. C#网络编程之 UDP编程

    C# 网络编程 UDP 转载于:https://www.cnblogs.com/miniwiki/archive/2009/07/24/1709833.html

  8. Java网络编程之UDP与TCP的网络编程

    ⭐️前面的话⭐️ 本文将介绍java中的网络编程,常见的网络编程方式有两种,一种是UDP,另外一种是TCP,其中UDP的服务器与客户端之间不需要建立连接就能进行通信,而TCP需要先建立服务器与客户端之 ...

  9. java网络编程udp_Java网络编程之UDP

    UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议, ...

最新文章

  1. 阿布扎比成立全球首所培养研究生的人工智能大学
  2. HTTP协议:看个新闻原来这么麻烦
  3. wordpress 独立 php,wordpress怎么把所有文章分类单独在一个页面显示
  4. 机器学习基石笔记5——为什么机器可以学习(1)
  5. 聚焦国内名企开源!OSCAR 开源先锋日(1020)全部议程首次曝光
  6. java 标识符_java标识符的基础知识
  7. Android 拦截TextView中超链接点击事件
  8. 图片延迟加载(lazyload)的实现原理
  9. 太原科技大学计算机宿舍,太原科技大学宿舍怎么样
  10. pandownload 替代品_Pandownload倒下了,找一款替代品
  11. win7局域网共享设置_局域网硬盘一键共享软件下载-一键共享局域网修复查看设置工具包免费版...
  12. centos7安装kylo0.10.1
  13. Gabor滤波器特征提取原理讲解及c++实现
  14. 极客日报:爆字节跳动日均进账10.07亿元;iPhone 13粉屏上热搜;英特尔跌落神坛,CEO回应:是我们骄傲自大了
  15. Point Estimation
  16. 永久激活win和office
  17. Android设计模式(十六)-中介者模式
  18. JavaWeb阶段考核总结
  19. 安全测试值得学习的工具有哪些?
  20. Redis 3.0集群搭建/配置/FAQ

热门文章

  1. [Java]关于throw,throws,try{}catch(){}
  2. 利用HTML中的XML数据岛记录浏览
  3. 如何分割合并ISO文件
  4. Qt学习之路(11): MainWindow
  5. MAC地址和IP地址的关系
  6. java 子类 父类 转换_Java子类与父类之间的类型转换
  7. 【深度学习】Win10安装TensorFlow_gpu(避坑必看)
  8. GitHub+Hexo搭建自己的Blog之-主题配置
  9. Hive报错:Error: FUNCTION 'NUCLEUS_ASCII' already exists. (state=X0Y68,code=30000)
  10. appsettings 连接oracle数据库,ABP .net core集成访问Oracle数据库