【绿冰壶的脚本小屋】TCPUDP协议 与socket网络通信,学这一篇就够啦

这篇博客详细介绍了TCP和UDP协议原理,以及如何使用Python实现TCP和UDP的socket网络通信。涵盖了TCP的ACK确认应答机制、超时重传、可靠性,以及UDP的无连接、不可靠特性。通过实例展示了TCP和UDP的服务器端和客户端的代码实现,帮助读者理解网络通信的基本过程。
摘要由CSDN通过智能技术生成

TCP/UDP协议 与socket网络通信 学这一篇就够啦

任务目标:建立 socket 连接通道,可以相互之间传输数据

使用环境:python

任务要求:

1、理解TCP、UDP协议的原理及特点。

2、分别使用 TCP、UDP 协议实现数据通讯。

拓展任务:

实现客户端发送命令,服务端接收命令并执行。

前言

好令人蒙蔽,大雾。

tcp,udp,socket 这些陌生的词汇。与网络通信又有怎样的关系?

全然未知的探索,具有极大的挑战性,同时蕴含着更多的乐趣。

让我们出发,去了解这些生涩的词汇,以及背后的原理。

不同电脑上的进程之间如何通信?

本篇报告的题目叫网络通信开发基础。那么我们首先要知道,不同电脑上,不同进程之间是如何通信的。

实现网络通信,首要解决的问题就是如何唯一的标识出一个进程。标识为何重要呢?假如标识不唯一,那么就意味着两个人可以用一张嘴说话。试想,如果爸爸和儿子用一张嘴说话,那么你该如何回答?世界不就乱套了。同理,实现网络通信,必须要实现唯一标识。

在1台电脑上可以通过进程进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的(因为不同的电脑上关于某进程的进程号可能都不一样,无法统一)

在TCP/IP协议族已经帮我们解决了这个问题。网络层的**“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)。利用ip地址,协议+端口**,我们就可以唯一标识主机中的进程了。网络中的进程通信就可以利用这个标志与其他进程进行交互。

socket简介

socket(简称 套接字) 是进程间通信的一种方式,他与其他进程间通信方式的主要不同是,它能实现不同主机之间的进程间通信。我们上网的大多通信服务,都是基于socket的 如浏览网页,qq聊天,收发Email等

未命名文件 _1_.jpg

创建socket

在python中,使用socket模块的函数就可以完成。

基本格式
import socket
 
socket.socket(AddressFamily, Type, protocal=0)
 
# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
# ...这里是使用套接字的功能(省略)...
 
# 不用的时候,关闭套接字
s.close()
常用函数与方法

参数说明:

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

服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

注意:**bind()**其中INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。

客户端套接字函数

s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数

s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字

面向锁的套接字方法

s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间

面向文件的套接字的函数

s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件

TCP、UDP的原理及特点

TCP原理

TCP全称为 “传输控制协议(Transmission Control Protocol”). 从名字就能看出来,TCP协议 要对数据的传输进行一个详细的控制。

Untitled Diagram.jpg

源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去。

TCP报头长度(4位): 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60

六位标志位

URG: 紧急指针是否有效
ACK: 确认号是否有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题.

16位紧急指针: 标识哪部分数据是紧急数据;

TCP ACK 确认应答机制

未命名文件 _2_.jpg

当主机a传输数据给主机b,主机b收到数据后会返回一个字节的确认应答数据,表示数据被正常运输。

TCP 超时重传机制

主机A发送数据给主机B后,可能因为网络拥堵等原因,数据包无法抵达,如果主机a在特定时间期限内没有收到应答,则会重新发送数据包。以下是超时重传的两种情况示意图。未命名文件 _3_.jpg

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值