本文作者:PsgQ

本文链接:https://www.cnblogs.com/PsgQ/p/14089310.html

如何发送数据包?

Q:当应用程序产生数据的时候,需要去构造数据包并发送到网络上去,但是由谁负责处理呢?

A:现代操作系统负责数据包得构造与发送,应用程序只需提供数据。 当应用程序产生数据时,应用程序将数据交给OS内核,然后在OS内核添加各层的首部,构建好数据包,然后交给网卡,发送到网络中去。

Q:应用程序如何向OS 发送数据呢?

A: OS为程序提供了一个接口,即socket API,类似于系统调用函数。

Q:通过socket API,只需要提供数据吗?

A:并不,还需要告诉OS 内核,目的端口是什么,传输层使用哪种协议(UDP/TCP),目的IP地址。

Q:为什么不需要告诉源端口?

A:因为源端口是当数据进入到OS内核时,OS会为这个应用程序随机开放一个端口,作为源端口。当服务器端收到数据,进行返回时,也从这个端口进行返回。同样源IP地址,OS内核也是选一个网卡出去,这个网卡的地址作为源IP地址。

详情可见下图:

Q:加工数据是包括什么?

A:依次包括添加传输层首部,网络层首部,所以在这里需要告诉传输层的目的端口,以及使用的协议,以及网络层的目的IP地址。然后交给网卡驱动程序,构造数据链路层头部,以及物理层。若想继续详细了解网卡的操作,可参考: 网卡工作原理详解 , 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

了解到上述信息,知道我们要告诉OS 目的IP地址,目的端口,以及数据。

下面是使用python网络编程客户端的代码:

import  socketip="127.0.0.1"port=8090data = b"hello PsgQ"sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)sock.sendto(data,(ip,port))

Q: socket函数里面的参数是什么意思?

A: socket.AF_INET表示使用IPv4。socket.SOCK_DGRAM表示传输层使用UDP。

Q:为什么data=b"hello PsgQ"?

A: 因为在网络中传输的是字节流,b前缀将字符串转换成bytes。对于英文字母可以这样转换,但对于中文字符串不行,因为b后面的字符串必须是ascii码可以表示的。若要传递中文字符串,须data=bytes('哈哈',encoding='UTF-8')

具体可参考 字符串和编码

c语言版代码随后更新。

如何接收数据包?

网卡驱动程序收到数据,作出校验以及检查完相应的目的MAC地址,交到OS内核。

OS内核 网络层模块 进行解封装,查看IP的目的地址,是不是发给自己的,丢弃IP地址不是自己的数据包。然后查看传输层使用的是什么协议,假如是UDP,之后交给UDP模块处理。

UDP获得数据包后,查看目的端口,发给相应的端口。

Q:应用程序怎么去获得数据阿?

A:每个应用程序想要去接收数据,都需要与相应的端口进行绑定。比如HTTP,默认80端口,DNS默认使用53端口等。即OS内核交付给相应的端口,就意味着交付到某个应用程序(通过socket API)。相当于告诉内核,任何时候只要有数据到达这个端口,可以把数据交给我。具体过程是,OS 内核交给相应的端口的缓冲区,这个缓冲区是与端口进行绑定的。应用程序可从这个缓冲区读取数据。

实际情况可能是:当没有数据时,这个应用程序的socket API会被阻塞掉,但当数据包到达时,OS内核会去激活这个进程。

如下图:

从上述信息了解到,我们在server端要进行绑定端口,因为可能有多个网卡,每个网卡IP地址不同,所以我们也要绑定IP地址等。

下面是使用python网络编程服务器端的代码:

import  socketip="0.0.0.0"port = 8090sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)sock.bind((ip,port))while True:    data,(ip,port)=sock.recvfrom(1024)    data=data.decode('ascii')    print("clinet:{},port:{}".format(ip,port))    print("Received:{}".format(data))

Q: ip ="0.0.0.0"?

A: 表示 数据包的目的地址可以是任意一个网卡的地址。

Q: data=data.decode('ascii')

A: 因为网络上使用的是字节流,前面客户端将字符串转换成了字节流,在这里使用ascii码进行解码,使字节流重又转换成字符串格式。

注意:调用bind函数 ,参数是(ip,port)

最终运行结果:

c语言版代码随后更新。谢谢大家。

本文作者:PsgQ

本文链接:https://www.cnblogs.com/PsgQ/p/14089310.html

udp recvfrom阻塞吗_网络编程原理与UDP实现相关推荐

  1. 网络编程原理进阶___TCP/IP(javaee)

    点击跳转 本章重点 网络编程原理进阶 应用层 DNS 传输层 UDP TCP面试重点 `TCP`原理 确认应答 超时重传 连接管理(面试重点) 3次握手 4次挥手 滑动窗口 流量控制 拥塞控制 延时应 ...

  2. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  3. python网络通信编程实例_python网络编程之数据传输UDP实例分析

    本文实例讲述了python网络编程之数据传输UDP实现方法.分享给大家供大家参考.具体分析如下: 一.问题: 你觉得网络上像msn,qq之类的工具在多台机器之间互相传输数据神秘吗?你也想玩一下在两台机 ...

  4. 网络编程第三讲UDP编写

    网络编程第三讲UDP编写 一丶UDP简介 UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP UDP不需要建立建立. 下面有UDP编写流程图 下图 ...

  5. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  6. JavaEE 网络编程示例1 UDP套接字数据报编程 == 一发一收

    鲁吼呀,胶己人! 文章目录 JavaEE & 网络编程示例1 & UDP套接字数据报编程 ==> 一发一收 1. 协议分层(回顾) 2. 套接字 Socket 2.1 UDP与T ...

  7. QT入门第七天 网络编程TCP/IP/UDP+Http和JSON解析+qt事件软键盘【CSDN最详细】

    网络编程+Http和JSON解析+qt事件软键盘 第一章 QT中的网络编程 [1]涉及到的类 [2]tcp协议的流程 [2.1]服务器的流程 socket-->bind-->listen- ...

  8. 深入浅出网络编程TCP,UDP,Socket,Http网络编程面试题

    目录 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 TCP / UDP Socket HTTP 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 OSI 参考模型         ...

  9. Qt网络编程-简易版UDP组播通信入门Demo(5)

    Qt网络编程-简易版UDP组播通信入门Demo(5)

最新文章

  1. 设计模式之监听器模式
  2. Linux01-BASH的while流程控制41
  3. boost::stl_interfaces模块实现反向迭代器的测试程序
  4. 阿里内部mysql规范40条
  5. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波2 - 图像反转、对数变换
  6. 十五、详述 IntelliJ IDEA 插件的安装及使用方法
  7. JAVA和Android的回调机制
  8. Python 2.7.X安装dpkt, sendpkt, pycap
  9. springboot国际化04
  10. 研究生阅读管理文献---我阅读科研文献的一些做法
  11. 计算机办公自动化知识试题及答案,2015年计算机办公自动化考试试题及答案
  12. 一行 Python 能实现什么丧心病狂的功能?
  13. 和字节跳动大佬的技术面谈,醍醐灌顶!
  14. JAVA把指定文件放入压缩包
  15. JS之键盘事件案例(重要)
  16. 用个人博客打造一个酷酷的工作流
  17. angularjs 获取复选框的值_基于uFUN开发板的心率计(一)DMA方式获取传感器数据
  18. C语言,班级班费管理系统
  19. animation 只触发一次的解决办法
  20. 嵌入式Linux 根文件系统rootfs的构建

热门文章

  1. python自动办公pdf_[Python] 自动化办公 PDF提取文字、表格、图片
  2. MySQL中varchar类型字段隐式转换造成多删除数据
  3. 从零开始学php 光盘,从零开始学PHP(第2版)(含DVD光盘1张)
  4. java线性表合并_合并两个线性表
  5. sap后台配置原因代码_【MM配置】Inventory Management 库存管理
  6. 1177: 按要求排序(指针专题)_数据结构 8 基础排序算法详解、快速排序的实现、了解分治法...
  7. python常见的控制流结构有_【Python】控制流语句、函数、模块、数据结构
  8. Provisional headers are shown问题
  9. Swagger2 生成API文档时泛型总是显示不出来的问题
  10. IDEA debug模式,修改集合的值