网络编程原理与UDP实现
如何发送数据包?
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 socket
ip="127.0.0.1"
port=8090
data = 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 socket
ip="0.0.0.0"
port = 8090
sock=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)
最终运行结果:
网络编程原理与UDP实现的更多相关文章
- Socket网络编程TCP、UDP演示样例
Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(O ...
- 网游中的网络编程3:在UDP上建立虚拟连接
目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网络编程3:在UDP上建立虚拟连接 TODO 二.在UDP上建立虚拟连接 介绍 UDP是无连接的,一 ...
- 网络编程第三讲UDP编写
网络编程第三讲UDP编写 一丶UDP简介 UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP UDP不需要建立建立. 下面有UDP编写流程图 下图 ...
- C#网络编程入门之UDP
目录: C#网络编程入门系列包括三篇文章: (一)C#网络编程入门之UDP (二)C#网络编程入门之TCP (三)C#网络编程入门之HTTP 一.概述 UDP和TCP是网络通讯常用的两个传输协议,C# ...
- TCP/IP网络编程之基于UDP的服务端/客户端
理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...
- Linux Linux程序练习十一(网络编程大文件发送UDP版)
//网络编程发送端--大文件传输(UDP) #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- Linux网络编程10——使用UDP实现五子棋对战
思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...
- javase的网络编程(InetAddress,UDP,TCP,URL,Socket,DatagramSocket)
通过一段时间对java网络编程相关内容的学习,写下这篇随笔,对这一部分的知识进行梳理和总结. 网络编程 一.网络编程三要素: IP地址:网络会给每个联网的主机分配一个数字的编码地址,该地址就是IP地址 ...
- [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结
TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1. ...
随机推荐
- 2.1获取Git仓库-2.2记录每次更新到仓库
2.1 获取 Git 仓库 获取 Git 仓库通常有两种方式 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器 克隆 一个已存在的 Git 仓库. 在已存在目录中初始化仓库 首先进入该 ...
- Preparation for MCM/ICM Writing
Preparation for MCM/ICM Writing -- by Chance Zhang $1^{st}ed$ key words: MCM/ICM, format, phrases, t ...
- leetcode114:valid-sudoku
题目描述 根据数独的规则Sudoku Puzzles - The Rules.判断给出的局面是不是一个符合规则的数独局面 数独盘面可以被部分填写,空的位置用字符'.'.表示 这是一个部分填写的符合规则 ...
- leetcode76set-matrix-zeroes
题目描述 给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法. 拓展: 你的算法有使用额外的空间吗? 一种比较直接的算法是利用O(m,n)的空间,但是这 ...
- jQuery JSONP
同源策略 浏览器不允许跨域发送Ajax请求,如你在http://127.0.0.1:8000/下发送一个Ajax请求去获取http://127.0.0.1:9000/的资源. 如何解决这个问题?其实j ...
- canvas基础[二]教你编写贝塞尔曲线工具
贝塞尔曲线 bezierCurveTo 在线工具 https://canvature.appspot.com/ [感觉这个好用一些] https://blogs.sitepointstatic.com ...
- 7. 基于MLlib的机器学习
*以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第七部分是讲的是如何使用Spark中提供机器学习函数的MLlib库,在集群中并行运行机器学习算法. MLlib是Spark中提 ...
- binary hacks读数笔记(readelf命令)
可以用readelf命令来查看elf文件内容,跟objdump相比,这个命令更详细. 1. readelf -h SimpleSection.o ELF Header: Magic: 7f 45 4c ...
- 记录一次读取hdfs文件时出现的问题java.net.ConnectException: Connection refused
公司的hadoop集群是之前的同事搭建的,我(小白一个)在spark shell中读取hdfs上的文件时,执行以下指令 >>> word=sc.textFile("hdfs ...
- Avoided redundant navigation to current location: "/users"
问题产生的原因:在Vue导航菜单中,重复点击一个菜单,即重复触发一个相同的路由,会报错,但不影响功能 解决:在router的配置文件中加入如下代码: const originalPush = Rout ...