tcp,udp tcp三次握手四次挥手,基于套接字进行简单通信
1.应用层:
应用层功能:规定应用程序的数据格式。
例:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
2.传输层:
传输层功能:建立端口到端口的通信
补充:端口范围0-65535,0-1023为系统占用端口
tcp协议:
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割
3.osi七层协议

4.TCP三次握手四次挥手:

ACK = x+1 加1是为了确认是否为发送链接的服务端
(listen())为半连接池:就是一个存储连接的地方,客服端请求过来连接的,但是服务端未处理,所以叫半连接
5 基于套接字通信:
TCP(传输控制协议:可靠协议):
tcp协议是基于数据流的,所有发送的数据不能为空,需要客户端服务端添加空的判断机制
TCP协议会将间隔时间较小并且数据量小的数据黏在一起,合成一个大数据块,然后进行封包
5.1:tcp协议服务端:
'''
服务端应该满足的特点:
1.一直提供服务
2.并发的提供服务
'''
import socket
#1.买手机
# phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议--> tcp协议
phone = socket.socket() #默认是TCP协议
phone = setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #不用担心端口报错
# 2.绑定手机卡
# 0.0.0.0 ----> 代表允许任何的ip链接
phone.bind(('127.0.0.1',8080)) #ip+端口(0-65535)1024以前的都被系统保留使用
#3.开机 (监听状态)
phone.listen(5) #5指的是半连接池大小
#4.等待电话连接请求:拿到电话连接conn
#加上链接循环
while True:
conn,client_addr = phone.accept() #接受,程序启动后,会在accept这里夯住,阻塞
print(conn) #连接对象,三次握手的双向通路
print('客户端的ip和端口:',client_addr)
while True:
try:
#5.通信:收/发消息
data = conn.recv(1024) #最大接受的数据量为1024Bytes,收到的是bytes类型
if len(data) == 0:
# 针对unix系统里,一旦data收到为空
# 意味着是一种异常的行为:客户非法断开链接
break
print('客户端发来的消息:',data.decode('utf8'))
conn.send(data.upper())
except Exception:
#针对windows系统
break
#6.关闭电话连接comm
conn.close()
#7.关机(可选操作)
# phone.close()
tcp协议客户端:
import socket
#1.买手机 sokcet类 地址家族
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议--> tcp协议
#2.拨通服务端电话
phone.connect(('127.0.0.1',8080)) #进行3次握手
while True:
msg = input('输入要发送的消息:').strip()
if len(msg) == 0:continue #解决输入空格的bug
if msg == 'quit':
break
# 3.通信
phone.send(msg.encode('utf8')) #编码以二进制的形式发送
data = phone.recv(1024)
print(data.decode('utf8')) #解码
#4.关机连接(必选的回收资源的操作)
phone.close()
UDP(用户数据报协议):
无连接,面向消息,提供高效率服务,不会使用块的合并有优化算法,可以输入空(udp会自动帮你封装消息头)
支持一对多,所以接收端skbuff(套接字缓冲区)采用链式结构记录每一个到达的udp包
5.2udp协议服务端(用在对实时性要求很高的程序上面)
import socket
sever = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #udp协议
sever.bind(('127.0.0.1',8081))
while True:
data,client_addr = sever.recvfrom(1024)
sever.sendto(data.upper(),client_addr)
sever.close()
udp协议客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #udp协议
while True:
msg = input('输入要发送的消息:').strip()
client.sendto((msg.encode('utf8')),('127.0.0.1',8081))
res = client.recvfrom(1024)
print(res)
client.close()
如果是 from socket import *
那么client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)可以简写为client = socket(AF_INET,SOCK_DGRAM)
不用加前缀
发送文件的方式:
with open('1.mp4',rb) as f:
for line in f:
conn.send(line)
tcp,udp tcp三次握手四次挥手,基于套接字进行简单通信的更多相关文章
- Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)
Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义: ...
- python摸爬滚打之----tcp协议的三次握手四次挥手
TCP协议的三次握手, 四次挥手 三次握手过程 1, 服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态; 2, 客户端进程然后向服务器发出连接请求报文, 之后客户端 ...
- TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP.SMTP.TCP.UDP.IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP ...
- TCP/IP,三次握手四次挥手,TCP/UDP , HTTP/HTTPS
internet:通用名词,由多个计算机网络组成的网络,网络间的通信协议是任意的 Internet:专用名词,当前全球最大的开放计算机网络,采用TCP/IP协议族作为通信的规则.www万维网是广泛应用 ...
- OSI七层协议&TCP协议(三次握手四次挥手)
今日内容 python 基础回顾 软件开发架构 网络理论前戏 OSI 七层协议(五层) TCP协议 三次握手与四次挥手 UDP协议 内容详细 一.python 基础回顾 1.基本数据类型 整型 int ...
- TCP/IP报文 三次握手 四次挥手
1.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图:图1 TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序 ...
- 关于TCP传输的三次握手四次挥手策略
简单小总结: 一般为了能够准确无误地把数据送达目标处,TCP协议采用了三次握手策略.用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达. 注:握手过程中使用 ...
- TCP传输的三次握手四次挥手策略
为了准确无误地数据送达目标处,TCP协议采用了三次握手策略.用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达.握手中使用了TCP的标志:SYN和ACK 发 ...
- tcp协议:三次握手四次挥手详解-转
https://www.cnblogs.com/welan/p/9925119.html
- tcp/ip原理/三次握手/四次挥手
@ tcp/ip原理 1.1 tcp/ip三次握手 1.1.1 建立过程说明 a) 由主机A发送建立TCP连接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 并且还将报文中SY ...
随机推荐
- Tomcat和Maven安装与配置
链接:https://pan.baidu.com/s/1aezz2pfCn0DCCPw8udQFXA 提取码:wd4f 一.网站发布1.1.为什么要用tomcat网页开发好了,该如何发布呢?我们需要一 ...
- Linux系列---【U盘插入后,linux系统如何查看U盘中的内容?】
U盘插入后,linux系统如何查看U盘中的内容? 1.插入U盘 2.输入命令查看U盘是否插入成功 sudo fdisk -l 输入上面命令后,在最下面Device Boot一栏查看自己的U盘所在的分区 ...
- MySQL 日期相关
NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期/时间表达式的日期部分 EXTRACT() 返回日期/时间按的单独 ...
- FCC 中级算法题 数组扁平化
Steamroller 对嵌套的数组进行扁平化处理.你必须考虑到不同层级的嵌套. Array.isArray() 思路: (1)遍历arr,如果arr[i]是数组,就重新调用本函数继续循环,然后和新数 ...
- 打开配置windos 2016 防火墙 日志
1 点击"开始"或者win+R打开"运行"对话框 键入gpedit.msc
- Mysql 5.7 内存配置 (未完成)
innodb_buffer_pool_size = 4024024024 innodb 引擎,用于 缓存数据和索引
- 【随笔】Tomcat部署图片服务器Server.xml配置记录
在tomcat应用conf/server.xml文件的标签中添加下面内容: <Service name="imageService"> <!--分配8089端口 ...
- Ubuntu解决无法远程连接
检查SSH是否安装 ssh localhost 如果没有安装,通过APT的命令安装 sudo apt install openssh-server 无法连接Ubuntu中的root用户 其他用户可以连 ...
- Net6 读取POST请求 BODY中的内容
StreamReader stream = new StreamReader(Request.Body); string body = stream.ReadToEndAsync().GetAwait ...
- k8s configmap 配置分离
ConfigMap ConfigMap用于保存配置珊数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.一张图解释 上图就是整个ConfigMap的生命周期以及使用方式, ConfigMap的 ...