Python 网路编程读书笔记x UDP

UDP 协议基础

在IP网络层,所有的数据包会向一个指定的主机传输

Source IP  -> Destination IP

但是两台机器之间可能有许多独立的应用需要进行通信,因此为了区分不同的应用,所以有了端口号(port number)

Source (IP : port number) -> Destination (IP : port number)

通过这四个变量就可以确定一个特定的会话。

在Client 和 Server 进行通信时,通过Server会被分配一个固定的端口号。例如DNS服务器 port 53

而 Client 会有一个随机选取的端口号 例如 Pport 4137

UDP 协议会直接把数据包从Source 传递到 Destination

但是

Client如何知道Server的端口号是多少?

1. Convention:IANA组织已经为许多知名的服务分配了固定的端口号,例如 Port 53 是DNS

2. Automatic configuration:当一个计算机第一次接入网络中时,可以使用DHCP协议获取服务的IP地址,通过将获取的IP地址与常用的服务的端口号结合,就可以访问该服务

3. Manual configuration: 在剩下的情况中,可以采用人工分配。每一次在获取一个服务的时候,输入IP地址和端口号。

IAAN 端口号分配

 Well known ports (0-1023)最常见和广泛使用的服务的端口号。在Unix 系统中,这些端口号不能被用户程序使用,以避免恶意程序伪装成重要的服务。

 Registered ports (1024-19151)这些端口,通常不会被操作系统认为是特殊的服务,用户编写的程序可以使用这些端口。但是这些端口可以向IANA注册特殊的服务。IANA推荐最好避免将端口分配给不相关的程序。

 The remaining port numbers (49152–65535) 这些端口都可以自由使用的,Client 随机选择端口号是通常从这里选择。

每一个端口号,有一个非数字的名字。在Python中可以使用getserverbyname 来获取这些非 数字 的名字 对应的端口号。

import socket
socket.getservbyname(‘domain‘)

例如以上代码可以获取 domain 服务的端口号 “53”

著名的服务名称及其端口号通常存储在linux 和mac 的 /etc/services 目录下。

Sockets

import argparse, socket
from datetime import datetime
MAX_BYTES = 65535
def server(port):
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  sock.bind((‘127.0.0.1‘, port))
  print(‘Listening at {}‘.format(sock.getsockname()))
  while True:
    data, address = sock.recvfrom(MAX_BYTES)
    text = data.decode(‘ascii‘)
    print(‘The client at {} says {!r}‘.format(address, text))
    text = ‘Your data was {} bytes long‘.format(len(data))
    data = text.encode(‘ascii‘)
    sock.sendto(data, address)
def client(port):
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  text = ‘The time is {}‘.format(datetime.now())
  data = text.encode(‘ascii‘)
  sock.sendto(data, (‘127.0.0.1‘, port))
  print(‘The OS assigned me the address {}‘.format(sock.getsockname()))
  data, address = sock.recvfrom(MAX_BYTES) # Danger!
  text = data.decode(‘ascii‘)
  print(‘The server {} replied {!r}‘.format(address, text))

在以上的代码中使用socket()方法创建了一个socket, AF_INET 是socket 种类, 而SOCK_DGRAME 是数据包数据类型,意味这它将在IP网络中使用UDP。

该socket 之后会通过blind 方法和一个(IP,port)绑定在一起。(如果端口号已经被使用,那么这个步骤会失败。OSError: [Errno 98] Address already in use)

socket.getsockname() 会返回一个包含IP地址和端口号的元组。

socket.recvfrom(MAX_BYTES) 告诉程序server 将会接受最大长度为65535的报文。recvfrom 会一直等待,直到从客户端成功收到一个数据。

一旦收到了报文,recvform()将会返回client 地址 以及它发送的数据包的内容。 使用python 将这些数据包转换成字符串,并输出。

if __name__ == ‘__main__‘:
    choices = {‘client‘: client, ‘server‘: server}
    parser = argparse.ArgumentParser(description=‘Send and receive UDP locally‘)
    parser.add_argument(‘role‘, choices=choices, help=‘which role to play‘)
    parser.add_argument(‘-p‘, metavar=‘PORT‘, type=int, default=1060,help=‘UDP port (default 1060)‘)
    args = parser.parse_args()
    function = choices[args.role]
    function(args.p)

这段代码,通过命令行参数选择执行客户端还是服务器,程序。 -p 用来设置端口号

 PROMISCUOUS CLIENT

一个客户端可能会接收并记录它收到的所有的数据包,而且不会考虑该数据包是否来自正确的地址,这样的client 称之为 promiscuous client。

这样的client 可以用来对网络进行监控,然而他也有可能产生问题,使得client 收到虚假的数据包。为了避免这个问题需要做亮点检查

时间: 2024-12-12 16:27:57

Python 网路编程读书笔记x UDP的相关文章

java 并发编程读书笔记

1.同步容器,同步容器包括Vector和HashTable,是早期jdk的一部分.另一部分是同步包装类,以Collections.synchronizedxxx的工厂方法创建. 2.同步容器虽然是线程安全的,但是对于复合操作,有时你可能需要加上额外的客户端加锁进行保护,即对于使用这些容器的客户端代码,如果存在复合操作,还是可能存在风险. 3.例如check-and-act操作.循环中的元素操作等,如果在客户端代码中没有额外的锁,都会发生意想不到的问题. 4.造成这些的问题都可以通过在客户端加锁来

C++Windows核心编程读书笔记

转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔记": 关键词:c++windows 核心 编程 读书笔记 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁

TCP/IP网络编程读书笔记-简单的套接字编程(1)

在linux和windows下都是通过套接字编程进行网络编程.不同的系统上通信有部分差别,现在刚开始学习,给自己学习的时候一个总结. 一,socket函数的套接字步骤 第一,linux网络编程中接受连接请求(服务器端)套接字的四个步骤: 1)调用socket函数创建套接字 2)调用bind函数分配IP地址和端口号 3)调用listen函数转为可接收请求状态 4)调用accept函数受理连接请求 第二,linux网络编程中请求连接(客户端)套接字的两个步骤: 1)调用socket函数创建套接字 2

TCP/IP 网络编程 (抄书笔记 2) -- UDP

TCP/IP 网络编程 (抄书笔记 2) – UDP TCP/IP 网络编程 (抄书笔记 2) – UDP Table of Contents server client connect 来源: <TCP/IP 网络编程> 抄书: TCP 协议若要向 10 个客户端提供服务, 除了需要 listen 套接字外, 还需要 10 个服务器端套接字 (accept), 但是在 UDP 中, 不管是服务器端还是客户端都只需要 1 个套接字 udp 的 client 不需要 bind, 调用 sendt

机器学习【1】(Python Machine Learning读书笔记)

依旧是作为读书笔记发布,不涉及太多代码和工具,作为了解性文章来介绍机器学习. 文章主要分为两个部分,machine learning的概述和 scikit-learn的简单介绍,两部分关系紧密,合并书写,以致整体篇幅较长,分为1.2两篇. 首先,是关于机器学习.要点如下: 1.1 机器学习三种主要方式 1.2 四大过程 1.3 python相关实现(安装包) [1.1] 机器学习方式主要有三大类:supervised learning(监督式学习), unsupervised learning(

python socket编程 ,tcp,udp服务端客户端创建

转自http://blog.csdn.net/rebelqsp/article/details/22109925 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 下面讲的是Socket模块功能 1.Socket 类型 套接字格式: socket(family,type[,protocal]) 使用给定的地址族.套接字类型.协议编号

简明python教程的读书笔记(三)

一.面向对象的编程: 面向过程的编程:根据操作数据的函数或语句块来设计程序的.这被称 为. 面向对象的编程:把数据和功能结合起来,用称为对象的东西包裹起来组织程序 的方法.这种方法称为面向对象的 编程理念. 类和对象:是面向对象编程的两个主要方面.类创建一个新类型,而对象这个类的实例 .这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象). 怎么创建类:类使用class关键字创建.类的域和方法被列在一个缩进块中. 类的组成:对象可以使用普通的属于     对象的变量存储数据

pthon核心编程-读书笔记:知识点摘录与总结(方便理解和快速记忆)

Python 中的列表(大小可变的数组)和字典(哈希表)就是内建于语言本身的.在核心语言中提供这些重要的构建单元,可以鼓励人们使用它们, 缩短开发时间与代码量,产生出可读性更好的代码.C不提供, c++功能不够简洁. 面向对象, 可升级:Python 提倡简洁的代码设计.高级的数据结构和模块化的组件,确保灵活性. 一致性并缩短必要的调试时间 扩展性:兼容扩展c和java 易读写,易维护 健壮性:Python 提供了"安全合理"的退出机制, Python由于错误崩溃,解释程序就会转出一个

简明python教程的读书笔记

python编程是一件愉快的事情!!! 一.python的特点: 它注重的是如何解决问题而不是编程语言的语法和结构. 当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类 的底层细节. 可移植性 支持面向对象和面向过程的编程 可嵌入性:可以在python代码中嵌入c或者c++ 丰富的库 二.python代码执行的过程: 源代码.py-> 字节码.pyc ->字节码在PVM(Python虚拟机)中执行 二.python IDE: http://www.pydev.o