标签:应用层协议 gbk 指定 状态 调用 浏览器 三次 image linu
1.他是一个软件,是操作系统连接硬件与软件的纽带
现存的操作系统:windows,linux,macOS
C:client客户端 B:browser浏览器 S:server服务器
C/S架构: 基于客户端与服务端的架构
B/S 架构:特殊的C/S架构
从一台计算机的一个软件将一个数据(文件,音频等)发送到另一台计算机的那个软件上 (软件与软件之间的通信)
计算机 + 操作系统 + 软件
1)一系列的物理连接介质 2) 地址确定对方的软件的位置 3) 一系列的互联网协议
五层协议:
????????物理层: 物理连接介质 光纤,双绞线等等 (以电信号的方式)
物理层发送的数据:高低电平 01010001111...
???????? 数据链路层(二层): 主要是对数据进行分组 封包:源地址,目标地址
开始不统一,后来统一标准:
数据分两部分:
???????? 数据头 :固定18个字节 , 源地址6个字节, 目标地址 6个字节,数据类型 6个 字节
???????? 数据
数据分为组的形式:一组电信号叫数据报 ,也叫帧
head长度+ data 长度 =最短67字节,最长1518字节,超过最大限制就分片发送
网卡: mac地址 就是计算机的唯一标识,计算机出厂就会有网卡,网卡就会有一个mac地址
12位 16进制 前6位:厂商编号 后6位:流水线号
通信方式:广播 mac+广播形式只在局域网中实行
Arp协议:地址解析协议 通过ip地址获取mac地址(广播 单播)
二层交换机(局域网内部的通信) : 单播 广播 组播、 网卡
????????网络层(第三层协议):确定局域网的位置
ip协议:寻找对方局域网的位置
ip+mac +广播的形式就能确定世界上任何一个计算机的位置
Ipv4 iipv6
路由器(局域网之间通信) | 三层交换机(带有路由功能的交换机)
????????传输层(第四层): (tcp和udp协议) 每个软件都有一个固定的端口
0~65535 1~1024 系统占用 自己用在8000以后
端口: 确定软件的位置
端口 + ip + mac + 广播 就能确定世界上任何一个计算机软件的位置
四层交换机 四层路由器
????????应用层 : 每个软件对于数据都有不同的自定义协议 (FTP,www等)
????????表示层
????????会话层
数据链路层:
1) 原则上:同一个局域网就是通过 源mac地址 + 目标mac地址 + 数据 + 广播 可以将数据传输.
2) 这里 有一个交换机mac地址自主学习功能.
交换机有一个mac 与 网口的对照表.
1 40-8D-5C-93-F1-DE
2 40-8D-5C-93-F2-DE
3 41-8D-5C-93-F1-DE
.....
24 40-8D-5F-93-F1-DE
3) 同一个局域网之内发送一个数据:
源mac地址: 40-8D-5C-93-F1-DE 目标mac地址 40-8D-5F-93-F1-DE 数据
4) 如果交换机第一次连接这些电脑:第一次 我的网口1连接的计算机发送一个数据,发送给目标mac,第一次的时候是不知道目标mac地址是多少的.
IP地址 + ARP协议 计算出对方的mac地址.
5) 同一个局域网之内:
第一次发送数据 需要广播的形式,获取对方的mac地址,将mac地址与网口写入交换机的对照表.
第二次发送数据(计算机与网口没更换):不用广播,而是直接从mac对照表寻找对方的地址.
1) 细节补充:怎么通过ip寻找对方的局域网的位置?
2) ipv4:
四点分十进制:
0~255.0~255.0~255.0~255
同一个局域网内所有计算机的IP地址绝对不同.
172.16.10.1
子网掩码(C类): 255.255.255.0
3) IP + 子网掩码才能确定是否在同一个网段,同一个子网,同一个局域网
4) 如果子网掩码都是C类:255.255.255.0,那么 一个局域网可以分配多少个ip?
前提是C类子网掩码:一个网段:最多能有256个IP: 0 不能用, 255 不能用,254,: 253个IP/.
判断是不是同一个网段
5) 端口 + IP + 子网掩码 + mac + 广播的形式就可以确定世界上任何一个计算机软件的位置.
精简: ip协议和ARP 协议可以获取我的mac地址,
端口和ip地址 就可以确定世界上任何一个计算机软件的位置.
总结:
通过计算机发送数据,我要先获取对方的ip和子网掩码:
去判断是不是同一个局域网
如果是同一个局域网: 通过IP ARP协议 获取mac 发送数据.
如果不是同一个局域网:网关(路由协议)一层一层的发送.
6) 路由器:内网:DHCP协议:自动分配IP地址,子网掩码,网关IP地址
同一局域网内的所有计算机的IP一定不同,不同局域内
的计算机的IP可以相同
内网计算机的ip都是路由器虚拟出来的
外网: 连接外网,收发数据等
7) DNS服务器: 转化域名,IP地址 有一个字典
域名解析到ip的一个过程,{‘www.taobao.com’:192.145.12.1}
NAT技术:ip置换,将你的源ip置换成路由的ip
静态路由:将数据从路由A 传入路由D
路由协议:利用算法计算你达到目标路由的最短距离,数据由路由A发送到路由D,再通过端口映射技术发送到
京东服务器对应软件的端口
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。
1)tcp: 可靠的,面向连接的协议,全双工的,流式传输,传输速度慢(银行)
场景:# http pop3 ftp协议
Udp: 不可靠(股票),面向报文的,无连接的,一对多,多对多,一对一的通信的,传输速度快
场景:即时通讯类软件(QQ,微信) 在线观看视频
因为在传输数据时内部有回执策略,判断我发出去的 消息对方有没有收到,没有我就重发,通过这种方式让通信更可靠
3.简述三次握手,四次挥手
法一:
三次握手:
客户端向服务端发起一个syn请求
服务端回复ack,同时服务端发送syn请求
客户端再回复ack
connect --> accept
四次挥手:
客户端向服务端发起一个fin请求
服务端回复ack
服务端发送fin请求
客户端回复ack
close <--> close
法二:
三次握手:(1)客户端发送一个带syn=1 seq=x标志的TCP报文到服务器(2)服务器回应客户端,同时带ack=1+x和syn=1 seq=y标志(3)客户端必须再次回应服务端一个ack=1+y报文
四次挥手:(1)客户端发送一个fin=1 seq=x用来关闭客户到服务端的数据传送,(2)服务器收到fin=1 seq=x,给客户端发回ack=1+x (3)服务器关闭客户端连接,发送一个fin=1,seq=y,(4)客户端发回ack=1+y
或者面试的时候画出如下这个图也行
三次握手
四次挥手
1) Syn起同步的作用,假设不采用三次握手,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求server端会一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用三次握手的办法可以防止上述现象发生
2) 而三次握手是一种能应对网络不稳定情况的最简方案,对应到TCP的三次握手,其实就是为了应对已经失效的连接请求报文突然又传到服务端而产生的错误场景
Tcp协议称好人协议
一个服务器接受客户端的请求非常多,有黑客会制造很多大量的假ip,发送请求,真ip进不去,然后去处理大量的假ip , 服务端会定时发送请求,与假ip建立链接,服务端容易崩.
2. socket简单流程
3.写一个简单通信
1)一个客户端,一个网络端,让其实现数据传输 (先运行服务器端,在运行客户端)
2)多个客户端同时连接
服务端
客户端
3)远程操控subprocess
shell: 命令解释器,相当于调用cmd 执行指定的命令。
stdout:正确结果丢到管道中。
stderr:错了丢到另一个管道中。
windows操作系统的默认编码是gbk编码
import subprocess
obj=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
aa=obj.stdout.read().decode('gbk') 默认是gbk的字节
print(aa)
bb=obj.stderr.read().decode('gbk')
print(bb)
服务端
客户端
只存在于基于tcp协议的socket
造成粘包的现象
两个数据小 时间间隔短 就会在发送端粘包
数据传输到目的地之后,没有被及时接收,或者没有接收完,在接收端发生粘包
解决办法 : 自定义协议 添加报头
这是数据接收的流程:如下图
简述一下这张图:
第一种客户端输入命令,就会放到输出缓冲区,然后通过网络传给服务端的缓冲区,服务端接收1254,然后再通过网络send出去到了客户端的recv缓冲区(1254个字节), 但revc只接受1024个字节,所以客户端只接受了1024个,recv缓冲区还剩230个字节,只要客户端再send命令,此时send立马变成recv状态就会去接收上次剩下的230字节(解释不太清楚)
细节:,(只要客户端将数据send出去,就会立刻进入recv状态)
查看缓冲区大小
low版解决粘包问题 struct
import struct
# 将一个数字转化成等长度的bytes类型。
ret = struct.pack('i', 183456)
print(ret, type(ret), len(ret))
# 通过unpack反解回来
ret1 = struct.unpack('i',ret)[0]
print(ret1, type(ret1))
服务端
客户端
高大尚版解决粘包问题(上传下载)
服务端
客户端
服务端
客户端
1.socketserver实现并发 同时接受多个客户
服务端
客户端
标签:应用层协议 gbk 指定 状态 调用 浏览器 三次 image linu
原文地址:https://www.cnblogs.com/xm-179987734/p/12316390.html