python TCP协议与UDP协议
1. TCP协议 / UDP协议
1.1 TCP协议
1.可靠、慢、全双工通信
2.建立连接的时候 : 三次握手
3.断开连接的时候 : 四次挥手
4.在建立起连接之后
发送的每一条信息都有回执
为了保证数据的完整性,还有重传机制
5.长连接 :会一直占用双方的端口
6.IO(input,output)操作,输入和输出是相对内存来说的
write / send -----> 输出 output
read / recv ------> 输入 input
7.能够传递的数据长度几乎没有限制
1.2 UDP协议
- 1.无连接的 速度快
- 2.可能会丢消息
- 3.能够传递的数据的长度是有限的,是根据数据传递设备的设置有关系
1.3 应用场景
- TCP 文件的上传下载(发送邮件、网盘、缓存电影)
- UDP 即时通信类的(qq、微信、飞秋)
2. osi七层模型 /osi五层协议
| osi七层模型 | osi五层协议 | 协议 | 物理设备 | |
|---|---|---|---|---|
| 应用层 表示层 会话层 (三层总结成一层) |
五层 | 应用层 | http / https / ftp / smtp 协议 python代码:hello |
|
| 传输层 | 四层 | 传输层 | tcp协议 / udp协议 端口 | 四层路由器、四层交换机 |
| 网络层 | 三层 | 网络层 | ipv4 / ipv6 协议 | (三层)路由器、三层交换机 |
| 数据链路层 | 二层 | 数据链路层 | mac地址 arp协议 | 网卡、(二层)交换机 |
| 物理层 | 一层 | 物理层 |
3. socket(套接字)
socket 是一个工作在应用层和传输层之间的抽象层。
- 帮助我们完成了所有信息的组织和拼接
- sokcet对于程序员来说 已经是网络操作的底层了
socket历史:
- (初期)基于文件通信 -------- 完成同一台机器上的两个服务之间的通信的
- (现在)基于网路通信 -------- 完成了多台机器之间的多个服务通信
3.1 socket用于TCP协议
# server.py 服务端
import socket
sk = socket.socket()
# socket()参数中:family(基于……通信)=AF_INET(网络通信), type(协议)=SOCK_STREAM(TCP协议),TCP协议默认不用写,如果想要写协议必须是:type=socket.SOCK_STREAM
sk.bind(('192.168.12.25',9000))
sk.listen()
while True:
conn,addr = sk.accept()
while True:
msg = conn.recv(1024)
if msg.decode('utf-8').upper() == 'Q':
break
print(msg.decode('utf-8'))
cont = input('内容(输入Q断开):')
conn.send(cont.encode('utf-8'))
if cont.upper() == 'Q':
break
conn.close()
sk.close()
# client.py 客户端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
while True:
msg = sk.recv(1024)
if msg.decode('utf-8').upper() == 'Q':
break
print(msg.decode('utf-8'))
cont = input('内容(输入Q断开):')
sk.send(cont.encode('utf-8'))
if cont.upper() == 'Q':
break
sk.close()
sk.accept() 与 sk.connect() 是建立三次握手的过程
3.2 socket用于UDP协议
# server.py 服务端
import socket
sk = socket.socket(type = socket.SOCK_DGRAM) # UDP协议必须加上 type=socket.SOCK_DGRAM
sk.bind(('127.0.0.1',9000))
while True:
msg,client_addr = sk.recvfrom(1024) # recvfrom用于不知道对方ip时,获取到ip给client_addr
msg = msg.decode('utf-8')
print(msg)
msg1 = input('>>>').encode('utf-8')
sk.sendto(msg1,client_addr)
sk.close()
# client.py 客户端
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
while True:
inp = input('>>>').encode('utf-8')
sk.sendto(inp,('127.0.0.1',9000))
msg = sk.recv(1024).decode('utf-8') # 这里不需要使用recvfrom,因为知道对方ip地址
print(msg)
sk.close()
python TCP协议与UDP协议的更多相关文章
- python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)
先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...
- python基础-TCP协议和UDP协议
TCP协议是一种流式协议,UDP协议是一种数据包协议. TCP和UDP是OSI模型中传输层的协议.TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输. TCP和UDP区别总 ...
- python语法基础-网络编程-TCP协议和UDP协议
############### 网络编程 ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- TCP协议与UDP协议的区别
TCP协议与UDP协议的区别(转) 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- TCP协议和UDP协议的区别
1. TCP协议面向连接. UDP协议面向非连接 (有无链接)2. TCP协议传输速度慢. UDP协议传输速度快 (传输速度)3. TCP协议保证数据顺序. UDP协议不保证 (数据的有序性. 在IP ...
- (转)TCP协议与UDP协议的区别
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- IP地址、端口、TCP协议、UDP协议
最近在看<疯狂java讲义>,第17章网络编程里提到IP地址.端口.TCP协议.UDP协议这几个概念.以前上课时学过,现在重温了一遍.在这里,用自己的语言简单的讲解一下吧. IP地址:每一 ...
- TCP/IP协议、UDP协议、 Http协议
开放式系统互联通信参考模型(Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化 ...
- TCP协议和UDP协议基础介绍
TCP协议和UDP协议区别 标签(空格分隔): TCP,udp TCP的三次握手 TCP被称为可靠的数据传输协议,主要是通过许多机制来实现的其中最主要的就是三次握手的功能,当然,TCP传送数据的机制非 ...
随机推荐
- 第四章vs2107 代码实际运用-后台权限管理讲解 创建角色
先看一下项目整体结构图: 实体类和数据操作都在前面用TT模板批量生产了.下面开始介绍权限代码这块的逻辑. 创建角色开始. 1. 角色的创建我们用到三张表 A.menuinfo(菜单表) role(角 ...
- Redis操作命令大全
一.key pattern 查询相应的key (1)redis允许模糊查询key 有3个通配符 *.?.[] (2)randomkey:返回随机key (3)type key:返回key存储的类型 ...
- concurrent包下的Exchanger练习
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据. 当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exc ...
- iOS APNs远程推送流程精简版
1.去Apple Developer Center里创建应用的信息,指定APP ID(Bundle ID),配置里开启推送功能(Push Notifications). 后续步骤需要用到这个应用的包名 ...
- postgreSQL 创建user表时引发的表名大写与双引号问题
在postgreSQL里面,user是一个保留字. 如果你想创建user表,你可能会遭遇一些问题! 如图: 可以看到,这里是无法创建user表的. 你可能会说,我只是没有加双引号"" ...
- JDK集合框架--综述
接下来的几篇博客总结一下对jdk中常用集合类知识,本篇博客先整体性地介绍一下集合及其主要的api: 从整体上来说,集合分两大类collection和map: 首先来看看Collection: c ...
- [BZOJ1046][HAOI2007]上升序列 DP+贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1046 我们先求出对于每一个数字作为开头的LCS的长度f[i],最长的f[i]为mxlen. ...
- Node.js(二)常用的系统模块
http模块 第一章已经介绍了 node.js 的模块都可以传一个回调函数 回调函数支持两个参数 error , data let fs = require('fs'); fs.readFile( ...
- git ---理论知识
理论基础: 不要高估自己的智商,不要低估Git的能耐. 1.Git记录的 是什么? 记录每一次版本变动的内容 将每个版本独立保存 方便分支管理. 2.git的三棵树---工作区.暂存区域和Git仓库 ...
- Java序列化技术性能分析(JDK原生与Protostuff)
熟悉Java的朋友应该知道Java有一个叫序列化的技术,即把一个Object转换为可保存,可传输的流数据.相应的,同时存在反序列化,即将流数据转换为Object类,而在转换的过程中,该Object保持 ...