Python网络编程之网络基础

  • 一、前言
  • 二、为什么要使用通信协议
  • 三、TCP/IP简介
    • 1.IP协议
    • 2.TCP协议
  • 四、UDP简介
  • 五、Socket 简介

一、前言

  计算机网络就是把各个计算机连接到一起,让网络中的计算机可以相互通信。网络编程就是如何在程序中实现两台计算机的通信。本文将讲解网络的基础知识,包括比较常见的TCP协议和UDP协议,以及如何使用TCP编程和UDP编程。

  当今的时代是一个网络的时代,网络无处不在。而我们前面学习编程的程序都是单机的,即不能和其他电脑上的程序进行通信。为了实现不同电脑之间的通信,就需要使用网络编程。下面我们来了解一下网络相关的基础知识。


二、为什么要使用通信协议

  计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容,这就好比一群人说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了,如图所示:


  为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)即通用协议标准出现了。Internet是由inter和net两个单词组合起来的,愿意就是连接“网络”的网络,有了Internet,任何私有网络,只要支持这个协议,就可以接入互联网。


三、TCP/IP简介

  因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网协议简称TCP/IP协议。


1.IP协议

  在通信时,通信双方必须知道对方标识,好比发送快递必须知道对方的地址。互联网上每个计算机的唯一标识就是IP地址。IP地址实际上是一个32位整数(称为IPv4),它是以字符串表示的IP地址,如172.16.254.1,实际上是把32位整数按8位分组后的数字表示,目的是便于阅读,如图所示:

  IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,类似于将一个大包裹拆分成几个小包裹,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由。但是不保证都能到达,也不能保障顺序到达。


2.TCP协议

  TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议通过三次握手建立可靠连接,如图所示:


  然后需要对每个IP包进行编号,确保对方按顺序收到,如果包丢了,就自动重发。如图所示:


  许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址、源端口和目标端口。

  端口有什么作用?在两台计算机通信时,只要发送IP地址是不够的,因为同一台计算机上运行着多个网络程序。一个TCP报文来了之后,到底是交给浏览器还是QQ,就需要端口号来区分。每个网络程序都向操作系统申请唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。

  一个进程也可能同时与多个计算机建立连接,因此它会申请很多端口,端口号不是随意使用的,而是按照一定的规则进行分配。例如,80端口分配给HTTP服务,21端口分配给FTP服务。


四、UDP简介

  相对TCP协议,UDP协议则是面向无连接的协议。使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,数据无法保障一定到达。虽然用UDP传输数据不可靠,但它的优点是比TCP协议的速度快。对于不要求可靠到达的数据而言,就可以使用UDP协议。TCP协议和UDP协议的区别如图所示:


五、Socket 简介

  为了让两个程序通过网络进行通信,二者均必须使用 Socket 套接字。Socket 的英文原义是“孔”或“插座”,通常也称为“套接字”,用于描述IP和端口,它是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,如图所示,在Internet上的主机上一般运行了多个服务软件,同时提供几种服务,每种服务打开一个Socket,并绑定到一个端口上,不同的端口对应不同的服务。


  Socket 正如其英文原义那样,像多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。

  在Python中使用socket模块的socket()函数就可以完成,语法格式如下:

s = socket.socket(AddressFamily, Type)

  函数socket.socket创建一个socket,返回该socket的描述符,该函数带有两个参数:

  • AddressFamily:可以选择AF_INET(用于Internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET。
  • Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据报套接字,主要用于UDP协议)。

  例如,为了创建TCP/IP套接字,可以用下面的方式调用socket.socket():

tcpSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  同样,为了创建UDP/IP套接字,需要执行以下语句:

udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

  创建完成后,生成一个socket对象,socket对象的主要方法如下表所示:

socket 对象的内置函数
函数 功能
服务器端套接字函数
bind() 用于绑定地址(host, port)到套接字,在 AF_INET 下,以元组(host, port)的形式表示地址
listen() 用于开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 即可
accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来
客户端套接字函数
connect() 主动初始化 TCP 服务器连接,一般 address 是形式为(hostname, port)的二元组,如果连接出错,则返回socket.error错误
connect_ex() connect() 函数的扩展版本,在出错时返回出错码,而不是抛出异常
公共用途的套接字函数
recv() 接收 TCP 数据,数:据以字符串形式返回,bufsize 指定要接收的最大数据量,flags 提供有关消息的其他信息,通常可以忽略
send() 发送 TCP 数据,将字符串中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于字符串的长度
sendall() 完整发送 TCP 数据。将字符串中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。若成功,则返回 None;若失败,则抛出异常
recvform() 接收 UDP 数据,与 recv() 的功能类似,但返回值是 (data, address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址
公共用途的套接字函数
sendto() 发送 UDP 数据,将数据发送到套接字,address 是形式为 (ipaddr, port) 的元组,用于指定远程地址。返回值是发送的字节数
close() 关闭套接字
getpeername() 返回连接套接字的远程地址。返回值通常是元组(ipaddr, port)

getsockname()

返回套接字自己的地址。返回值通常是元组(ipaddr, port)
setsockopt(level, optname, value) 设置给定套接字选项的值
getsockopt(level, optname[,buflen]) 返回套接字选项的值
settimeout(timeout) 设置套接字操作的超时时间,timeout 是一个浮点数,单位是秒。值为 None 表示没有超时时间。一般,超时时间应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
gettimeout() 返回当前超时时间的值,单位是秒,如果没有设置超时时间,则返回 None
fileno() 返回套接字的文件描述符
setblocking(flag) 如果 flag 为 0,则将套接字设为非阻塞模式;否则,将套接字设为阻塞模式(默认值)。在非阻塞模式下,如果调用 recv() 没有发现任何数据,或 send() 调用无法立即发送数据,那么将引起 socket.error 异常
makefile() 创建一个与套接字相关联的文件

Python网络编程之网络基础相关推荐

  1. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  2. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  3. 13、python网络编程之网络通信协议

    python网络编程之网络通信协议 一.C/S与B/S架构 B/S架构 B/S架构中省去了客户端的开发,是基于浏览器(Browser)与服务端完成数据的通信 二.网络通信 什么是网络 网络是用物理链路 ...

  4. 【网络编程】网络基础知识

    前言 小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ ...

  5. 网络编程:网络协议简介

    这是张富涛的第10篇原创 网络编程:网络协议简介 网络协议在网络编程中是一个比较神秘的概念,今天就由我们揭开它神秘的面纱吧. 1. 什么是网络协议? 网络协议是指对于网络中传输的数据格式的规定.在计算 ...

  6. 【技术分享篇】从网卡到tcpip协议栈,再到应用程序丨tcp/ip网络编程丨网络api的实现原理丨sk_buff的作用

     从网卡 聊到tcp/ip协议栈,再到应用程序 1. posix tcp/ip网络编程 2. 网络api的实现原理 3. sk_buff的作用 [技术分享篇]面试中从网卡 聊到tcpip协议栈,再到应 ...

  7. android网络编程及网络超时处理

    android网络编程及网络超时处理 本文是收录的两篇关于这方面的文章 Android超时机制的处理 由于手机端应用的响应,与当时的无线通信网络状况有很大的关联.而通信网络往往具有不稳定,延迟长的特点 ...

  8. python 网络编程 计算机部分基础 和初识tcp和udp

    架构 ---- 程序员开发的一种模式 C/S 架构  客户端/服务器模式 B/S架构  Browser浏览器/服务器模式 B/S架构的优势:统一了应用的接口 软件开发的架构 我们了解的涉及到两个程序之 ...

  9. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  10. python 复习——网络编程(三)——网络基础、多线程、ftp任务铺垫

    一.网络基础 学习网络编程,了解一些网络基础的知识是必不可少的,下面学习一些基础的网络知识: 1.我们的电脑里有网卡,网卡里有mac地址: 2.我到某个地方插上网线,路由器或交换机中的DHCP服务为我 ...

最新文章

  1. 深度学习在阿里B2B电商推荐系统中的实践
  2. EntityFramework Core 1.1是如何创建DbContext实例的呢?
  3. 观山湖区计算机培训班学校,2020年观山湖区教育系统办公室主任培训顺利开班...
  4. 360的困兽之斗——重新探讨奇虎商业模式
  5. seata分布式事务框架原理
  6. HDU - 4461 The Power of Xiangqi
  7. Dreamwear如何创建javascript_JavaScript 太糟糕,JVM 有妙招!
  8. python开发怎么成长_成长路线图:如何成为一名Python开发者?
  9. 【Flume】举例分析如何配置Flume
  10. oss上传报错_layui+oss阿里云附件上传回调报错问题
  11. rpm 安装、卸载软件命令 ——以nginx为例
  12. nlp----基于检索的问答系统(bert相似度模型,倒排表)
  13. (转载)Fiddler 教程
  14. python整数类型与数学-Python类型和运算--数字
  15. 计算机829大纲,829计算机基础考试大纲
  16. 小波分析及相应MATLAB实现
  17. 额头、太阳穴、两鬓长痘痘怎么回事?
  18. UPC 小澳的葫芦 (最短路+01分数规划 )
  19. opencv3.4.4 +contrib模块在win10+vs2017的编译和配置
  20. mysql漏洞补丁升级_mysql 5.7 高危漏洞及升级修复步骤

热门文章

  1. 计算机化分析原理波涛,证券期货投资计算机化技术分析原理(波涛).pdf.pdf
  2. openpyxl python 框线_Openpyxl对单元格应用边框
  3. 甲方爸爸素材给得少,怎么做出高大上的设计?
  4. css各种字体英文名称
  5. Mars《Android开发视频教程》
  6. Arduino提高篇01—点亮OLED显示屏
  7. Beanshell相关
  8. 8个经典无线射频识别(RFID)优选方案
  9. tl494cn逆变器电路图_tl494简单逆变器电路
  10. (高级)Matlab绘制中国地图超全教程详解