网络编程中的TCP和UDP

 

什么是TCP协议

TCP( Transmission control protocol )即传输控制协议,是一种面向连接、可靠的数据传输协议,它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。

  • 面向连接 :数据传输之前客户端和服务器端必须建立连接

  • 可靠的 :数据传输是有序的 要对数据进行校验

 

TCP三次握手

为了保证客户端和服务器端的可靠连接,TCP建立连接时必须要进行三次会话,也叫TCP三次握手,进行三次握手的目的是为了确认双方的接收能力和发送能力是否正常。

  1. 第一次握手(呼叫请求)
    • 你(客户端):想要和某人通话,于是你拿起电话,拨打对方的号码。这个动作相当于TCP中的SYN(同步序列编号)包发送。你告诉对方(服务器):“嘿,我在这里,我想和你建立通话。”
  2. 第二次握手(接听确认)
    • 对方(服务器):听到电话铃声后,接起电话,并对你的呼叫做出响应。这相当于TCP中的SYN-ACK(同步确认)包发送。对方(服务器)说:“我听到了,我也在这里,我们可以开始通话了。”同时,对方(服务器)也确认了你的存在,并准备好接下来的通信。
  3. 第三次握手(确认接听)
    • 你(客户端):在听到对方的接听确认后,你回应一个确认信号,告诉对方你已经准备好开始通话了。这相当于TCP中的ACK(确认)包发送。你说:“好的,我已经准备好了,我们可以开始通话了。”

 

  • 第一次握手 TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT 同步已发送状态
  • 第二次握手 TCP服务器收到请求报文后,如果同意连接,则会向客户端发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了 SYN-RCVD 同步收到状态.
  • 第三次握手 TCP客户端收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED已建立连接状态 触发三次握手

三次握手主要作用:防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误

第一次握手: 客户端向服务器端发送报文 证明客户端的发送能力正常 第二次握手:服务器端接收到报文并向客户端发送报文 证明服务器端的接收能力、发送能力正常 第三次握手:客户端向服务器发送报文 证明客户端的接收能力正常


TCP四次挥手

建立TCP连接需要三次握手,终止TCP连接需要四次挥手。

张三:好的,那我先走了

李四:好的,那你走吧

李四:那我也走了?

张三:好的,你走吧  

 

Socket的定义

Socket的英文原义是“孔”或“插座”,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket),socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

Python 官方关于 Socket 的函数 socket — Low-level networking interface — Python 3.12.4 documentation

Socket的类型  

  • TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的, 每次发送要指定是发给谁。

  • 服务端与客户端不能直接发送列表,元组,字典。需要字节化(data)。

服务端socket函数:

客户端Socket函数

 

共有的函数 :

SOCKET函数描述
s.recv(bufsize[,flag])接受TCP,UDP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。
s.send(string[,flag])发送TCP,UDP数据。
s.sendall(string[,flag])完整发送TCP数据。
s.recvfrom(bufsize[.flag])接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。
s.sendto(string[,flag],address)发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。
s.close()关闭套接字。
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字自己的地址。
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])设置给定套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期
s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
s.fileno()返回套接字的文件描述符。
s.setblocking(flag)如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。
s.makefile()创建一个与该套接字相关连的文件

TCP实现一对一的简单聊天

服务端代码:

from socket import *tcp_server = socket(AF_INET, SOCK_STREAM)# 绑定本地信息,TCP服务器程序监听所有网络接口上的88888端口
host_port = ('', 88888)  
tcp_server.bind(host_port)# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server.listen(5)while True:newSocket, host_port = tcp_server.accept()while True:# 最大接收1024个字节recvData = newSocket.recv(1024)if len(recvData) > 0:print('recv:', recvData)else:breaksendData = input("send:")newSocket.send(sendData.encode('utf8'))newSocket.close()tcp_server.close()

客户端代码:

from socket import *tcp_client = socket(AF_INET, SOCK_STREAM)# 链接服务器
host_port = ('127.0.0.1', 88888)
tcp_client.connect(host_port)while True:sendData = input("send:")if len(sendData) > 0:tcp_client.send(sendData.encode('utf8'))else:break# 最大接收1024个字节recvData = tcp_client.recv(1024)print('recv:', recvData.decode('uft8'))tcp_client.close()

UDP

UDP ---(User Datagram Protocol) 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,没有超时重发等机制,所以传输速度很快。

UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

UDP特点:

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

【适用情况】 UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如

  • 语音广播

  • 视频

  • QQ

  • TFTP(简单文件传送)

  • 大型网络游戏

相比较于TCP注重速度流畅

UDP简单案例

服务端代码

import socketsk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定 IP 和端口号
sk.bind(('127.0.0.1', 88888))
while True:msg, addr = sk.recvfrom(1024)print('来自[%s:%s]的消息: %s' % (addr[0], addr[1], msg.decode('utf-8')))inp = input('>>>')sk.sendto(inp.encode('utf-8'), addr)sk.close()

 客户端代码:

import socketsk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ('127.0.0.1', 88888)
while True:msg = input('>>>')sk.sendto(msg.encode('utf-8'), addr)msg_recv, addr = sk.recvfrom(1024)print(msg_recv.decode('utf-8'))sk.close()

实现简单TFTP(基于UDP协议) 

实现一个简单的TFTP(Trivial File Transfer Protocol)服务器和客户端基于UDP协议是一个有趣的小练习。TFTP是一个简单的文件传输协议,它使用UDP协议,并且通常用于小文件的传输。

我们值实现最基本的功能:从服务器读取文件并发送到客户端。 

TFTP 服务器:

import socket  
import struct  def handle_client(sock, filename):  # 假设文件存在且小于65535字节  try:  with open(filename, 'rb') as file:  data = file.read(512)  # TFTP块大小为512字节  block_number = 1  while data:  # 发送DATA包:block_number + data  block_info = struct.pack('!H', block_number)  # 网络字节序的短整型  sock.sendto(block_info + data, client_address)  # 等待ACK  ack_data, _ = sock.recvfrom(2)  # 只接收block number  ack_block_number = struct.unpack('!H', ack_data)[0]  if ack_block_number != block_number:  print("Incorrect block number in ACK")  break  block_number += 1  data = file.read(512)  except FileNotFoundError:  # 发送ERROR包  error_code = 1  # File not found  error_msg = struct.pack('!HH', error_code, 0)  # TFTP错误消息格式  sock.sendto(error_msg, client_address)  def start_tftp_server(port, root_dir):  server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  server_socket.bind(('0.0.0.0', port))  print(f"TFTP server listening on port {port}...")  while True:  data, client_address = server_socket.recvfrom(1024)  # 接收RRQ或WRQ请求  # 这里简化处理,只处理RRQ  if data.startswith(b'\x00\x01'):  # RRQ的opcode  filename = data[2:].decode().split(b'\x00')[0]  filepath = f"{root_dir}/{filename}"  handle_client(server_socket, filepath)  if __name__ == "__main__":  start_tftp_server(69, './files') 

TFTP 客户端:

import socket  
import struct  def request_file(server_ip, server_port, filename):  client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 发送RRQ请求  rrq = b'\x00\x01' + filename.encode() + b'\x00' + b'octet' + b'\x00'  # mode为octet  client_socket.sendto(rrq, (server_ip, server_port))  block_number = 0  data = b''  while True:  # 接收DATA包  data_packet, _ = client_socket.recvfrom(514)  # 512字节数据 + 2字节块号  block_number = struct.unpack('!H', data_packet[:2])[0]  if block_number == 0:  # 假设块号为0表示文件结束或错误  break  data += data_packet[2:]  # 发送ACK  ack = struct.pack('!H', block_number)  client_socket.sendto(ack, (server_ip, server_port))  client_socket.close()  # 处理接收到的数据(例如,写入文件)  with open(filename, 'wb') as file:  file.write(data)  if __name__ == "__main__":  request_file('127.0.0.1', 69)file_name = 'example.txt'  request_file(server_addr, 69, file_name)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/380723.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机体系结构||指令的调度和延迟分布(3)

实验3 指令的调度和延迟分布 3.1实验目的 (1)加深对指令调度技术的理解。 (2)加深对延迟分支技术的理解。 (3)熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。 (4)进一…

最新版kubeadm搭建k8s(已成功搭建)

kubeadm搭建k8s(已成功搭建) 环境配置 主节点 k8s-master:4核8G、40GB硬盘、CentOS7.9(内网IP:10.16.64.67) 从节点 k8s-node1: 4核8G、40GB硬盘、CentOS7.9(内网IP:10…

【Word】——小技巧

1.PDF相关转换word PDF转换成Word在线转换器 - 免费 - CleverPDF 2. word插入公式 1.软件推荐(免费) 可直接将图片,截屏公式转为word标准规范形式 2.网址推荐 在线LaTeX公式编辑器-编辑器 (每天有免费使次数) 3.…

机器学习——降维算法PCA和SVD(sklearn)

目录 一、基础认识 1. 介绍 2. 认识 “ 维度 ” (1)数组和Series (2)DataFrame 表 (3)图像 3. 降维思想 4. 降维步骤 二、降维算法(PCA) 1. PCA实现 (1&#…

【深度学习】BeautyGAN: 美妆,化妆,人脸美妆

https://www.sysu-hcp.net/userfiles/files/2021/03/01/3327b564380f20c9.pdf 【深度学习】BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversarial Network BeautyGAN: Instance-level Facial Makeup Transfer with Deep Generative Adversaria…

微服务设计原则——高性能:锁

文章目录 1.锁的问题2.无锁2.1 串行无锁2.2 无锁数据结构 3.减少锁竞争参考文献 1.锁的问题 高性能系统中使用锁,往往带来的坏处要大于好处。 并发编程中,锁带解决了安全问题,同时也带来了性能问题,因为锁让并发处理变成了串行操…

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册 前言: 什么是 MySQL? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,…

Kafka Producer发送消息流程之消息异步发送和同步发送

文章目录 1. 异步发送2. 同步发送 1. 异步发送 Kafka默认就是异步发送,在Main线程中的多条消息,没有严格的先后顺序,Sender发送后就继续下一条,异步接受结果。 public class KafkaProducerCallbackTest {public static void mai…

JVM:JavaAgent技术

文章目录 一、Java工具的介绍二、Java Agent技术1、介绍2、静态加载模式3、动态加载模式 三、搭建java agent静态加载模式环境1、创建maven项目2、编写类和premain方法3、编写MANIFEST.MF文件4、使用maven-assembly-plugin进行打包5、创建Spring Boot应用 一、Java工具的介绍 …

C++ | Leetcode C++题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size(), n matrix[0].size();int x 0, y n - 1;while (x < m && y > 0) {if (matrix[x][y] targ…

HTML5大作业三农有机,农产品,农庄,农旅网站源码

文章目录 1.设计来源1.1 轮播图页面头部效果1.2 栏目列表页面效果1.3 页面底部导航效果 2.效果和源码2.1 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…

Spring3(代理模式 Spring1案例补充 Aop 面试题)

一、代理模式 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能&#xff0c;这种类型的设计模式属于结构型模式。 代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介&#xff0c;负责将客户端…

Visual Studio 2022美化

说明&#xff1a; VS版本&#xff1a;Visual Studio Community 2022 背景美化 【扩展】【管理扩展】搜索“ClaudiaIDE”&#xff0c;【下载】&#xff0c;安装完扩展要重启VS 在wallhaven下载壁纸图片作为文本编辑器区域背景图片 【工具】【选项】搜索ClaudiaIDE&#xff…

基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

目录 专题一、深度学习发展与机器学习 专题二、深度卷积网络基本原理 专题三、TensorFlow与Keras介绍与入门 专题四、PyTorch介绍与入门 专题五、卷积神经网络实践与遥感图像场景分类 专题六、深度学习与遥感图像检测 专题七、遥感图像检测案例 专题八、深度学习与遥感…

四、GD32 MCU 常见外设介绍

系统架构 1.RCU 时钟介绍 众所周知&#xff0c;时钟是MCU能正常运行的基本条件&#xff0c;就好比心跳或脉搏&#xff0c;为所有的工作单元提供时间 基数。时钟控制单元提供了一系列频率的时钟功能&#xff0c;包括多个内部RC振荡器时钟(IRC)、一个外部 高速晶体振荡器时钟(H…

《背包乱斗》为什么好玩 苹果电脑怎么玩《背包乱斗》游戏 mac怎么玩steam windows游戏

在当今竞争激烈的游戏市场中&#xff0c;《背包乱斗》以其独特的魅力在众多作品中脱颖而出&#xff0c;吸引了大量玩家的关注和喜爱。其创新的游戏机制和不断迭代的内容&#xff0c;加之出色的视觉效果和社区建设&#xff0c;使其成为了游戏界的一股清流。 一、《背包乱斗》为…

【计算机视觉】siamfc论文复现实现目标追踪

什么是目标跟踪 使用视频序列第一帧的图像(包括bounding box的位置)&#xff0c;来找出目标出现在后序帧位置的一种方法。 什么是孪生网络结构 孪生网络结构其思想是将一个训练样本(已知类别)和一个测试样本(未知类别)输入到两个CNN(这两个CNN往往是权值共享的)中&#xff0…

jmeter部署

一、windows环境下部署 1、安装jdk并配置jdk的环境变量 (1) 安装jdk jdk下载完成后双击安装包&#xff1a;无限点击"下一步"直到完成&#xff0c;默认路径即可。 (2) jdk安装完成后配置jdk的环境变量 找到环境变量中的系统变量&#xff1a;此电脑 --> 右键属性 …

Figma 中文版指南:获取和安装汉化插件

Figma是一种主流的在线团队合作设计工具&#xff0c;也是一种基于 Web 端的设计工具。在当今的设计时代&#xff0c;Figma 的使用满足了每个人的设计需求&#xff0c;不仅可以实现在线编辑&#xff0c;还可以方便日常管理&#xff0c;有效提高工作效率。然而&#xff0c;相信很…

RPM、YUM 安装 xtrabackup 8 (mysql 热备系列一)包含rpm安装 mysql 8 配置主从

RPM安装 percona-xtrabackup-80-8.0.35-30.1.el7.x86_64.rpm 官网&#xff1a; https://www.percona.com/ 下载地址&#xff1a; https://www.percona.com/downloads wget https://downloads.percona.com/downloads/percona-distribution-mysql-ps/percona-distribution-mysq…