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 收到虚假的数据包。为了避免这个问题需要做亮点检查

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

  1. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  2. python高性能编程 读书笔记

    GIL 确保 Python 进程一次只能执行一条指令 ====分析工具cProfile 分析函数耗时line_profiler  逐行分析 heapy 追踪 Python 内存中所有的对象— 这对于消 ...

  3. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

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

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  5. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  6. unix环境高级编程-读书笔记与习题解答-第一篇

    从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...

  7. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  8. MacTalk·人生元编程 - 读书笔记

    简介 <MacTalk·人生元编程>是一本随笔文集,主要内容来自作者的微信公众平台"MacTalk By 池建强".本书撰写于2013年,书中时间线却不止于此.作者以一 ...

  9. JavaScript 函数式编程读书笔记2

    概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...

随机推荐

  1. maven clean 报错

    eclipse在使用maven的tomcat控件编译java程序时,报错 Failed to execute goal org.apache.maven.plugins:maven-clean-plu ...

  2. Linux 相关scsi命令

    Linux 相关scsi命令 由于前段时间存储扩容,对存储操作较多,下面记录了常用的操作: lsscsi命令:显示scsi设备信息 #lsscsi [0:0:0:2]    disk    IBM   ...

  3. 慕课python3.5学习笔记

    本文章中有部分代码为python2 慕课python入门 慕课python进阶 布尔值 布尔值可以用and.or和not运算. and运算是与运算,只有所有都为 True,and运算结果才是 True ...

  4. android获取apk签名信息

    因为工作需要,需要获取应用的apk传递给新浪微博或者微信去申请授权 所以需要程序内获取签名上传服务器 做法如下:   public static String getAPPSecretString(A ...

  5. JAX-WS + Spring 开发webservice

    通过几天的时间研究了下使用jax-ws来开发webservice,看了网上的一些资料总结出jax-ws的开发大概分为两种. 以下项目使用的spring3.0,jar包可以到官网下载 第一种:使用独立的 ...

  6. Maven Build Life Cycle--reference

    What is Build Lifecycle? A Build Lifecycle is a well defined sequence of phases which define the ord ...

  7. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

  8. Android Studio学习随笔-移动动画的实现

    在上一篇博客我已经讲述了三种事件的实现方法,而现在我用复用方法来实现控件的自动移动,当然要实现控件的移动,先得在activity_main.xml文件中放置一个控件,此处我放置的是一个button控件 ...

  9. 当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?

    有时我们需要将ViewPager嵌套在其他已经含有手势动作的ViewGroup里,如ScrollView,ListView时,会造成手势冲突,如表现为ViewPager向左划时,不小心向上移动了一点距 ...

  10. java中this关键字和static关键字和super关键字的用法

    this关键字 1. this 关键字是类内部当中对自己的一个引用,可以方便类中方法访问自己的属性: 2.可以返回对象的自己这个类的引用,同时还可以在一个构造函数当中调用另一个构造函数(这里面上面有个 ...