网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

TCP协议(流式协议)

​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数据的远程交互,该双向通道直到任意一方主动断开才会失效

TCP协议的“三次握手” 和 “四次挥手”

三次握手 建连接

​ 1、客户端向服务端发送建立连接请求

​ 2、服务端返回收到请求信息,同时向客户端发送连接请求

​ 3、客户端接收到服务端发来的请求,返回连接成功给服务端,完成双向连接

建立好连接后,会有一个反馈机制

​ 客户端往服务器发送请求,服务端必须返回响应,告诉客户端收到请求了,并且将服务端的数据一并返回给客户端

​ C ----> S :一次请求,必须有一次响应

优点

​ 数据安全

缺点

​ ①:传输速度慢

​ ②:洪水攻击

​ 指的是通过伪造大量的请求,往对方服务器发送请求,导致对方服务器响应跟不上,以至于瘫痪

​ 半连接池listen:限制用户在同一个时间段内的访问数量

四次挥手 断连接

​ 1、客户端向服务端发送断开连接的请求

​ 2、服务端返回接收到请求的信息给客户端

​ 3、服务端确认所有数据接收完成以后,再发送同意断开连接的请求给客户端

​ 4、客户端返回收到断开连接的请求,给服务端

UDP协议

UDP协议也被称之为数据包协议

UDP协议的特点:

​ ①:不需要建立连接

​ ②:不需要知道对方是否收到

​ ③:数据不安全,会丢包

​ ④:传输速度快

​ ⑤:能支持并发

​ ⑥:不会粘包

​ ⑦:无需先启动服务端再启动客户端

UDP的优点:

​ ①:传输速度快

​ ②:能支持并发

​ ③:不会粘包

UDP的缺点:(致命缺点)

数据不安全,容易丢失

UDP的应用场景:早期的QQ聊天室

socket套接字通信

什么是socket?

socket是一个模块,又称套接字,用来封装互联网协议(应用层以下的层)

为什么要有socket?

socket可以实现互联网协议应用层以下的层 的工作

提高开发效率

怎么使用socket?

# server.py文件
import socket
sever = socket.socket()
sever.bind(("127.0.0.1", 9527))
# 半连接池
sever.listen(5) # 最多接受5个客户端发送的请求,实际上是6个
# conn:指的是服务端网客户端的通道
coon, addr = sever.accept()
# 接收客户端发送过来的消息
ret = coon.recv(1024) # 一次可接受1024bytes的数据
print(ret)
# 关闭服务器
coon.close()
# client.py文件
"""
启动服务器后再启动客户端
"""
import socket client = socket.socket() client.connect(("127.0.0.1", 9527))
# 必须发送bytes类型的数据
# # 方式一
# client.send('hello'.encode('utf-8'))
# 方式二
client.send(b'hello')

粘包问题

TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

问题一:无法确认对方发送过来数据的大小

问题二:在发送数据时间隔短并且数据量小的情况下,会将所有数据一次性发送

解决方法: 确认对方的数据的大小

解决粘包问题(struct模块)

struct模块是什么?

是一个Python内置的模块,它可以将固定长度的数据,打包成固定格式的长度

常用的模式:i 模式

struct模块作用

​ 可以将真实数据,做成一个固定长度的报头,客户端发送给服务器,服务器可以接收报头,然后对报头进行解包,获取真实数据的长度,进行接收即可

import struct

data = b'11111111111111'
print(len(data))
# 打包制作报头
header = struct.pack('i', len(data))
print(header)
print(len(header)) # 解包获取真实数据长度 ---> 得到一个元组,元组中第一个值是真实数据的长度
res = struct.unpack('i', header)[0]
print(res)

扩展例题

# srever.py文件
import socket
import struct
import subprocess server = socket.socket()
server.bind(("127.0.0.1", 9527)) server.listen(5) while True: coon, addr = server.accept()
print(addr) while True:
try:
# 获取客户端传来的报头
header = coon.recv(4)
# 解包获取真实数据长度
data_len = struct.unpack('i', header)[0] # 准备接收真实数据
cmd = coon.recv(data_len) if len(cmd) == 0:
continue cmd = cmd.decode('utf-8')
if cmd == "q":
break obj = subprocess.Popen(
cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
) result = obj.stdout.read() + obj.stderr.read() print("发送给客户端的真实数据长度为", len(result)) header = struct.pack('i', len(result))
print(len(header))
coon.send(header)
coon.send(result) except Exception as e:
print(e)
break coon.close()
# client.py文件
import struct
import socket client = socket.socket()
client.connect(("127.0.0.1", 9527)) while True:
cmd = input("客户端输入的内容>>>:") cmd_bytes = cmd.encode('utf-8') # 做一个报头
header = struct.pack("i", len(cmd_bytes))
print(len(header)) client.send(header) # 待服务器确认长度后,发送真实数据长度
client.send(cmd_bytes) # 接收服务端返回的报头
header = client.recv(4) # 解包,接收服务端返回的真实数据
data_len = struct.unpack('i', header)[0]
result = client.recv(data_len) print("接收服务端返回的真实数据长度为:", len(result))
print(result.decode('gbk'))

网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法的更多相关文章

  1. python 网络编程 tcp和udp 协议

    1. 网络通信协议 osi七层,tcp\ip五层 tcp\ip五层 arp协议:通过IP地址找到mac地址 2.tcp和udp的区别 tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是 ...

  2. ~~网络编程(四):socket套接字~~

    进击のpython ***** 网络编程--socket socket的中文意思叫做套接字,socket方法其实也叫套接字方法 我们研究过TCP/UDP协议,但是要是让我们自己搭建,就十分困难了 而这 ...

  3. PHP Socket(套接字连接)扩展简介和使用方法

    PHP socket扩展是基于流行的BSD sockets,实现了和socket通讯功能的底层接口,它可以和客户端一样当做一个socket服务器. 使用这些函数时请注意,虽然他们中有很多和C函数同名的 ...

  4. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

  5. Socket网络编程TCP、UDP演示样例

    Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(O ...

  6. tcp套接字粘包解决办法

    粘包只会出现在tcp,udp传输不会产生粘包现象.解决粘包的原理就是服务器预先向客户端发送客户端即将获取文件的大小. 第一版解决方案: 服务器: # Author : Kelvin # Date : ...

  7. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  8. python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...

  9. Linux 网络编程五(UDP协议)

    UDP和TCP的对比 --UDP处理的细节比TCP少. --UDP不能保证消息被传送到目的地. --UDP不能保证数据包的传递顺序. --TCP处理UDP不处理的细节. --TCP是面向连接的协议 - ...

随机推荐

  1. centos7 安装gitlab及简单配置

    1.安装 wget -O gitlab.rpm https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.11.3 ...

  2. 201871010117-石欣钰《面向对象程序设计(JAVA)》第十四周学习总结

    项目 内容 这个作业属于哪个课程 <https://home.cnblogs.com/u/nwnu-daizh/> 这个作业的要求在哪里 <https://www.cnblogs.c ...

  3. 429 too many requests错误出现在wordpress后台更新及官网的5种解决方法

    从今年10月份开始wordpress服务经常出现429 too many requests错误,包括后台更新和访问wp官网,如下图所示,这是为什么呢?怎么处理呢?有大佬向官方论坛提问了,论坛主持人Ja ...

  4. JDOJ 1790: 高精度A-B

    JDOJ 1790: 高精度A-B JDOJ传送门 洛谷 P2142 高精度减法 洛谷传送门 题目描述 高精度减法 输入格式 两个整数a,b(第二个可能比第一个大) 输出格式 结果(是负数要输出负号) ...

  5. wal2json pg扩展centos7构建

    使用wal2json可以将pg 变动输出为json 格式,是一个pg 扩展,支持pg9.4+ 目前看到netflix 的dblog 对于pg 的支持就是基于此插件 以下是关于centos 7的构建说明 ...

  6. 获取客户端IP地址的三个HTTP请求头的区别

    一.没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP HTTP_VIA = 没数值或不显示 HTTP_X_FORWARDED_FOR = 没数值或不显示 二.使用透明代理服务器的情况 ...

  7. 【洛谷1829】 [国家集训队] Crash的数字表格(重拾莫比乌斯反演)

    点此看题面 大致题意: 求\(\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\). 推式子 不会莫比乌斯反演的可以先去看这篇博客:初学莫比乌斯反演. 反演题显然就是推式子啊~~~ 考 ...

  8. [LeetCode] 850. Rectangle Area II 矩形面积之二

    We are given a list of (axis-aligned) rectangles.  Each rectangle[i] = [x1, y1, x2, y2] , where (x1, ...

  9. 热情组——项目冲刺 Day6

    项目相关 作业相关 具体描述 班级 班级链接 作业要求 链接地址 团队名称 热情组 作业目标 实现软件制作,以及在福大的传播 Github链接 链接地址 SCRUM部分: 成员昵称 昨日目标 开始时间 ...

  10. NetCore 开发时中文编码转换出现异常

    在C#编程的时候难免会遇到需要转换编码的场合. 在Framwork中可以用System.Text.Encoding解决,但是到了core会发现,虽然也有这个东西,但几个关键的中文编码(比如GB2312 ...