TCP与UDP、socket模块
1.传输层之TCP与UDP协议
1.TCP协议
1.传输控制协议(也称为TCP协议或可靠协议)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议,(数据不容易丢失);造成数据不容易丢失的原因不是因为有双向通道,而是因为有反馈机制,类似工作机制如下:给对方发送消息之后会保留一个副本,知道你对方回应消息已收到时才会删除,否则会在一定时间内反复发送。
2.洪水攻击:同一时间有大量客户端请求建立连接,会导致服务端一直处于SYN_RCVD状态,如果遇到洪水攻击就应建立缓冲池,类似'排队'。
3.服务端如何区分客户端建立连接的请求:可以对请求做唯一标识
4.三次握手建立连接:
4.1 当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求,询问能否与服务端进行连接,这个数据包称为SYN包。
4.2 如果服务端同意则回复一个SYN+ACK包
4.3 客户端收到之后回复一个ACK包,建立连接
"""
三次握手的原因在于:假设采取两次握手建立连接,因为某些错误客户端的SYN1包没有到达服务器,在中间表某个节点产生滞留,此时客户端会重新发送SYN包,这次数据正常送达,服务端回复SYN+ACK之间建立连接,但是突然第一包的数据网络阶段突然恢复,SYN1此时送达服务端,这是服务端会认为是客户端重新发起一次连接。如果三次握手之后服务端收不到最后的ASK包,自然不会建立连接
"""
5.四次挥手断连接:
5.1 当客户端没有消息要发给服务端,由客户端首先发送syn消息请求断开通道。
5.2 服务端客户端回复ACK包,无条件同意断开请求。
5.3 服务端此时还可以发送未发送数据,而客户端还可以接受数据,待服务端发送完数据后,向客户端发送syn包,进入最后确认状态。
5.4 客户端收到之后回复ACK包,此时连接关闭。
"""
TCP类似于打电话,UCP类似于发短信
"""
2.UPD协议
1.也称为数据报协议、不可靠协议,早期的QQ使用的是纯生的(不加任何额外功能)UDP协议。使用UDP的原因就是因为很简单、快捷、粗暴、只要指定对方的地址就可以发消息了。
"""
TCP我们可以看成是打电话:双方有来有回
UDP我们可以看成是发短信:只要发了就行,不管对方看不看
"""
2.应用层
应用层相当于是程序员自己写的应用程序 里面的协议非常的多
常见的有:HTTP、HTTPS、FTP
3.socket模块(基于TCP协议)
1.socket介绍
如果我们需要编写基于网络进行数据交互的程序,意味着我们需要自己通过代码来控制我们之前所学习的OSI七层(很繁琐,很复杂,类似于我们自己编写操作系统)。socket类似于操作系统,封装了丑陋复杂的接口提供简单快捷的接口。
Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket也叫套接字
基于文件类型的套接字家族(单机):AF_UNIX
基于网络类型的套接字家族(联网:AF_INET
2.代码步骤
'''TCP是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端'''
server(服务)端:
import socket
1.创建套接字:sever = socket.socket()
2.绑定地址:sever.bind(('127.0.0.1', 8870))
''' "127.0.0.1"是回送地址,指本地机,一般用来测试,当客户端和服务端在一台电脑上时使用'''
3.侦听客户请求:sever.listen()
4.接收客户连接:sock,addr = sever.accept()
5.接收客户信息:data = sock.recv(1024) print(data.decode('utf8'))
6.向客户发送信息:sock.send(msg.encode('utf8')) # 需要转成二进制发送
7.关闭客户端套接字:sock.close()
client(客户)端:
import socket
1.创建套接字:client = socket.socket()
2.尝试链接服务器:client.connect(('127.0.0.1', 8870))
3.发送请求:client.send(发送的内容(字符串类型).encode('utf8'))
4.接受信息:data = client.recv(1024) print(data.decode('utf8'))
5.关闭套接字:client.close()
3.代码优化
1.聊天内容自定义:针对消息采用input获取
2.让聊天循环起来:用while加上循环
3.用户输入的消息不能为空:本质其实是两边不能都是recv或者send 一定是一方收一方发
4.服务端多次重启可能会报错,Address already in use(主要是mac电脑会报)
修改方法:
1.改端口号
2.拷贝以下代码:
from socket import SOL_SOCKET,SO_REUSEADDR # 放在import socket下面
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 在bind前加
5.当客户端异常断开的情况下,如何让服务端继续服务其他客人:
windows服务器会直接报错
mac服务端会有一段时间反复接收空消息延迟报错
优化后的代码(服务端未设置空白消息检测):
服务端:
import socket
from socket import SOL_SOCKET, SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8081))
server.listen(5)
while True: # 链接循环
sock, addr = server.accept()
while True: # 通信循环
try:
data = sock.recv(1024)
if len(data) == 0:
break
print(f'来自于客户端{addr}的消息>>>:', data.decode('utf8'))
msg = input('请输入发送给客户端的消息(不能发空消息)>>>:').strip()
sock.send(msg.encode('utf8'))
except BaseException:
break
客户端:
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8081))
while True:
msg = input('请输入您想要发送给服务端的消息>>>:').strip()
if len(msg) == 0:
print('不能发送空消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('来自于服务端发送过来的消息>>>:', data.decode('utf8'))
服务端设置成可以检测空白消息:
服务端:
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8082))
server.listen(5)
while True:
sock, addr = server.accept()
while True:
try:
data = sock.recv(1024)
print(f'来自客户端{addr}的消息>>>:',data.decode('utf8'))
while True:
msg = input('>>>:').strip()
if len(msg) == 0:
print('不能发送空白消息')
continue
break
sock.send(msg.encode('utf8'))
except Exception:
break
客户端:
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8082))
while True:
msg = input('>>>:').strip()
if len(msg) == 0:
print('不能发送空白消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('来自服务端的消息>>>:', data.decode('utf8'))
4.半连接池的概念
server.listen(5) # 半连接池
当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题)
假设服务端只有一个人的情况下
在测试半连接池的时候 可以不用input获取消息 直接把消息写死即可
TCP与UDP、socket模块的更多相关文章
- HTTP/TCP/IP UDP Socket等区别联系
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- [net]tcp和udp&socket
参考 TCP和UDP连接 关于传输层TCP.UDP协议可能我们平时遇见的会比较多,有人说TCP是安全的,UDP是不安全的,UDP传输比TCP快,那为什么呢,我们先从TCP的连接建立的过程开始分析,然后 ...
- TCP和UDP Socket
1.tcp协议的编程 * 1:客户端.步骤 * 1:创建Socket对象,构造方法里需要指定服务端的ip地址和端口. * Socket socket = new S ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具 推荐一些socket工具,TCP、UDP调试、抓包工具
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...
- 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具
老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...
- 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- VC++使用socket进行TCP、UDP通信实例总结
1. 两台计算机通信需要协议,通信的两台计算机IP必须唯一 2. 同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
随机推荐
- LoadRunner11使用代理录制脚本
一.背景 电脑安装了LoadRunner11,在进行脚本录制时发现录制的脚本为空,即录制时事件为0,也没有自动调出对应的浏览器:如下图: 问了度娘,发现LR11要成功录制脚本,对各浏览器的版本有要求! ...
- Codeforces Round #817 (Div. 4)
CF传送门 因为洛谷题库未更新,所以给出的题面都是CF的. 现场打真是太卡了(梯子挂了,codeforc.es也崩了),所以五六分钟才打开题目 \(qwq\) A. Spell Check 萌萌题,把 ...
- .NET二叉树,递归和迭代遍历二叉树
代码随想录: https://programmercarl.com .NET中二叉树的定义 public class TreeNode { public int val; public TreeNod ...
- jquery 简单分页插件jQuerypage
昨天项目手机端要用到table的分页,考虑到手机端界面小,系统数据不多,在没考虑大批量数据处理的前提前就下载了这个插件,简单. 展示数据datas为json格式. <!DOCTYPE html& ...
- 14 STL-常用算法
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 每一次学习都是为了追求智慧! 写在前面,本篇章主要介绍STL中常用算法. 算法主要由 ...
- 2.6:Python数据存取-文件、文件夹及目录、数据库
一.Python文件读写 1.文件的打开模式 <class '_io.TextIOWrapper'>和<class '_io.BufferedReader'>.python使用 ...
- windows安装grunt时提示不是内部或外部命令解决方案
参考:https://www.cnblogs.com/hts-technology/p/8477258.html 安装windows安装elasticsearch-head时 不需要输入grunt s ...
- 【每日一题】【哈希表,返回结果的下标】2022年1月18日-NC61 两数之和
描述给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列.(注:返回的数组下标从1开始算起) 算法: import java ...
- .NET 6 实现滑动验证码(四)、扩展类
为了能够通过配置文件(appsettings.json)或通过代码进行背景图片与模板进行配置.可自定义资源类型.自定义验证规则,本节创建一些扩展类,用来实现这些功能. 上一节内容:NET 6 实现滑动 ...
- Spring框架之IOC入门
1.开发环境 IDEA版本: 2022.1.4 Maven版本:3.8.6 Spring版本:6.0.2 2.案例分析 2.1 自定义Man类 2.2 自定义Company类 2.3 自定义Compa ...