传输层之TCP与UDP协议

TCP与UDP都是用来规定通信方式的
通信的时候可以随心所欲的聊 也可以遵循一些协议符合要求的聊
随心所欲的聊:文字 图片 视频
遵循一些协议:开头带尊称 首行空两个 只准用官话
ps:不遵循上述协议也可以通信 只不过遵循了更合规合法合理!!! 1.TCP协议(重要)(SOCK_STREAM)
三次握手建链接
1.TCP协议也称为可靠协议(数据不容易丢失)
造成数据不容易丢失的原因不是因为有双向通道 而是因为有反馈机制
给对方发了消息之后会保留一个副本 直到对方回应消息收到了才会删除
否则会在一定的时间内反复发送
2.洪水攻击
同一时间有大量的客户端请求建立链接 会导致服务端一直处于SYM_RCVD状态
3.服务端如何区分客户端建立链接的请求
可以对请求做唯一标识
四次挥手断链接
1.四次不能合并为三次
因为中间需要确认消息是否发完(TIME_WAIT)
"""
三次握手和四次挥手也可以看成是小情侣谈恋爱的过程
三次握手:表白在一起
四次挥手:决裂要分手
""" 2.UDP协议
也称为数据报协议、不可靠协议
早期的qq使用的是纯生的(没有加任何额外给你)UDP协议
现在的qq自己添加了很多技术和功能
使用UDP的原因就是因为很简单 快捷 粗暴 只要制定对方的地址就可以发消息了
"""
TCP我们可以看成是打电话:双方你侬我侬
UDP我们可以看成是发短信:只要发了就行 不管对方看不看
"""

三次握手流程图

四次挥手流程图

socket模块

如果我们需要编写基于网络进行数据交互的程序 意味着我们需要自己通过代码来控制我们之前所学的OSI七层(很繁琐 很复杂 类似于我们自己编写一个操作系统)
socket类似于操作系统 封装了丑陋复杂的接口提供简单快捷的接口 socket也叫套接字
基于文件类型的套接字家族(单机)
AF_UNIX
基于网络类型的套接字家族(联网)(我们使用的是基于网络的)
AF_INET # 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

scoket基本使用

import socket
socket.socket() # 产生socket对象
bind() # 绑定地址
listen() # 半连接池
accept() # 等待客户端连接
send() # 发送信息
recv() # 接受消息
connect() # 链接

socket代码简介

import socket

"""
以后要养成查看源码编写代码的思路
"""
# 1.产生一个socket对象并指定采用的通信版本和协议(TCP)
server = socket.socket() # 括号内不写参数默认TCP参数 family=AF_INET基于网络的套接字 type=SOCK_STREAM流式协议即TCP
# 2.绑定一个固定的地址(服务断必备的条件)
server.bind(('127.0.0.1',8080)) # 127.0.0.1为本地回环地址 只有自己的电脑可以访问
# 3.设立半连接池
server.listen(5)
# 4.等待接客
sock,addr = server.accept() # returan sock,addr 三次握手(可以看accept的源代码)
print(sock,addr) # sock就是双向通道 addr就是客户端地址
# 5.服务客人
data = sock.recv(1024) # 接收客户端发送过来的消息 最大1024字节
print(data.decode('utf8'))
sock.send('尊敬的客人 您说什么就是什么 一切按照您的要求来'.encode('utf8')) # 给客户端发送消息 主要消息必须是bytes类型
# 6.关闭双向通道
sock.close() # 四次挥手
# 7.关闭服务端
server.close() import socket
# 1.生成socket对象指定类型和协议
client = socket.socket
# 2.通过服务端的地址链接服务端
client.connect(('127.0.0.1',8080))
# 3.直接给服务端发送消息
client.send('大爷有钱 把你们店最好的给我叫出来'.encode('utf8'))
# 4.接收服务端发送过来的消息
data = client.recv(1024)
print(data.decode('utf8'))
# 5.断开与服务端的链接
client.close()

代码优化

1.聊天内容自定义
针对消息采用input获取
2.让聊天循环起来
将聊天的部分用循环包起来
1.聊天内容自定义
针对消息采用input获取
2.让聊天循环起来
将聊天的部分用循环包起来
3.用户输入的消息不能为空
本质其实是两边不能都是recv或者send 一定是一放收一方发
4.服务端多次重启可能会报错
Address already in use 主要是mac电脑会报
方式1:改端口号
方式2:博客里面代码拷贝即可
from socket import SOL_SOCKET,SO_REUSEADDR # 导入模块
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
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',8080))
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',8080)) while True:
msg = input('请输入你要发送给服务端的消息>>>:').strip()
if len(msg) == 0:
print('不能发送空消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('收到了来自服务端的消息>>>:',data.decode('utf8'))

半连接池的概念

server.listen(5)  # 半连接池

当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题)
假设服务端只有一个人的情况下
在测试办理案件池的时候 可以不用input获取消息 直接把消息写死即可

OSI七层协议剩余、socket模块、半连接池的更多相关文章

  1. 网络编程之网络架构及其演变过程、互联网与互联网的组成、OSI七层协议、socket抽象层

    目录 网络架构及其演变过程 单机架构 CS架构 BS架构 BS架构和CS架构的区别 C/S架构的优缺点: B/S架构的优缺点: 互联网与互联网的组成 互联网的组成(教科书版) 互联网的组成(科普版) ...

  2. 开发架构+osi七层协议+socket(day26)

    目录 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议/OSI七层协议 传输层 网络层 数据链路层 物理连接层 socket 什么是socket 为什么用socket 如何使用 软件开发架构 ...

  3. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程    1.OSI七层协议    2.基于tcp协议的套接字通信    3.模拟ssh远程执行命令    4.tcp的粘包问题及解决方案    5.基于udp协议的套接字 ...

  4. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  5. OSI七层协议补充与socket套节字

    OSI七层协议补充与socket套节字 一.传输层之TCP与UDP协议 TCP与UDP协议都是用来规定通信方式的,数据传输过程中能够遵循的协议有很多其中TCP协议和UDP协议是较为常见的两个. 1.T ...

  6. 1、网络并发编程--简介、软件开发架构、OSI七层协议

    python复习 变量与常量 基本数据类型 内置方法 字符编码.文件操作 函数 函数参数.闭包函数.装饰器 面向对象 封装.继承.多态 """ 什么是对象 数据与功能的结 ...

  7. 网络框架,互联网的组成,OSI七层协议,抽象层

    6.25自我总结 1.网络框架 1.单机 单机游戏 以下两个基于网络的 2.CS架构 cs--->client客户/server服务 服务端(应用程序)一个就够了,客户端(应用程序)可以有多个 ...

  8. 网络编程 - OSI七层协议详解

    目录 网络编程基础 软件开发架构 网络编程简介 OSI七层协议简介 OSI协议之物理连接层 OSI协议之数据链路层 网络相关专业名词 OSI之网络层 OSI协议之传输层 传输层之TCP协议/UDP协议 ...

  9. 网络编程前戏和OSI七层协议

    目录 一.软件开发架构 1.什么是软件开发架构 2.软件开发架构 架构方式一:c/s架构 架构方式二:b/s架构 架构优劣势 二.架构总结 三.网络编程前戏 1.什么是网络编程 2.学习网络编程的目的 ...

  10. OSI七层协议模型、TCP/IP四层模型学习笔记

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

随机推荐

  1. 系统优化脚本支持Ubuntu和CentOS

    系统优化脚本支持Ubuntu和CentOS 经常会部署各种用途的操作系统,但在这些工作中,我们会发现很多工作其实是重复性的劳动,操作的内容也是大同小异,基于这类情况,我们可以把相同的操作做成统一执行的 ...

  2. win32api中文在线文档

    中文文档http://www.yfvb.com/help/win32sdk/ 英文手册https://www.jb51.net/books/724576.html

  3. LeeCode哈希问题(一)

    LeeCode 242: 有效的字母异位词 题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.若 s 和 t 中每个字符出现的次数都相同,则称互为字母异位词. ...

  4. Terraform 系列-Terraform 简介

    系列文章 Terraform 系列文章 前言 最近在使用 Terraform 来置备 OCI 的 Always Free Tier, 发现它非常好用.总结学习下:Terraform 的基础知识. 什么 ...

  5. 【谷粒商城】(一)docker搭建以及项目的创建

    网络地址转换-端口转发 VmWare网络配置可以参考这篇:VMWare虚拟机网络连接设置_santirenpc的博客-CSDN博客_vmware 上网设置,真的是被折磨到了.. Docker 虚拟化容 ...

  6. 帝国cms随机sql语句,mysql高效的随机查询

    select * from AppleStorewhere rand()<0.015limit 100;

  7. Docker MariaDB配置主从复制

    编写主节点配置文件master.cnf: [client] # 默认字符集 default-character-set=utf8mb4 [mysqld] # 字符集 character-set-ser ...

  8. vue-element-admin 动态菜单改造

    vue-element-admin 动态菜单改造 vue-element-admin 是一款优秀后台前端解决方案,它基于 vue 和 element-ui实现.开源后台管理系统解决方案项目 Boot- ...

  9. Ajax 以及 Ajax基于Promise封装

    AJAX - 创建 XMLHttpRequest 对象 var xmlhttp = new XMLHttpRequest(); 通过打印实例对象我们发现,我们打印的是 xmlhttp 对象,里面所有的 ...

  10. springboot升级过程中踩坑定位分析记录 | 京东云技术团队

    作者:京东零售 李文龙 1.背景 " 俗话说:为了修复一个小bug而引入了一个更大bug " 因所负责的系统使用的spring框架版本5.1.5.RELEASE在线上出过一个偶发的 ...