IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 前后端交互笔记 -> 正文阅读

[网络协议]前后端交互笔记

TCP/IP协议四层模型

IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如192.168.0.1实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。

IPv6地址实际上是一个128位整数,16位分组,它是目前使用的IPv4的升级版,以字符串表示类似于2001:0db8:85a3:0042:1000:8a2e:0370:7334

顺便一提,IP不可靠,TCP可靠一点,IP发送给链路层数据时,有可能会造成数据丢失,TCP虽然使用的是不可靠的IP协议,仍然会有数据丢失的现象,但当数据丢失后,TCP会重新将丢失的数据发送一次,直到对应的数据送到目的地。所以相对来说是可靠的传输层协议。

eg.IP可看作是(网络层)快递公司,有丢件可能,TCP是卖家,会补发直到买家收到。

image-20210627153203761 img img
TCP的三次握手四次挥手

TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。

UDP协议

UDP,其不同于TCP,是一种不可靠的服务,但是速度快,即无法保证数据在传输的过程中不会丢失【会丢失】,常用的场景有:DNS查询、实时语音视频流传输、TFTP数据传输等

为何在这些场景中会用到UDP呢?我们拿其中一个举例,当双方通过网络进行打电话通信,如果对方说了20个字,但可能中间发生了数据丢失,即少传过来几个字,但一般来说我们还是能理解整句话是什么意思的。但若使用TCP会发生什么现象?对方说的20个字传过来18个字,因为那两个字丢失了,TCP重新发送了过来,因此可能在2s以后我们突然接收到了那两个字,这就非常的奇怪。

【用于部分数据丢失无伤大雅、严格补发反而会熵增的场合】

TCP/IP协议栈传输过程
在这里插入图片描述

是OSI模型的第2层(数据链路层)的数据包。帧是“一个数据链路层的传输单元,由一个数据链路层首部和其携带的数据包所组成”。比如:以太网帧、PPP帧等等

以太网传入的帧包含一个48位的目的地址和一个16位的以太网类型字段。其中类型字段:Ox0800(十六进制)表示这个帧包含IPv4的数据报;Ox0806和Ox86DD分别表示ARP和IPv6。假设目的地址与接收地址匹配,则会根据类型字段选择相应的网络层的协议

到达网络层以后就会交给IP来处理,IP会检测其中的IPv4的协议字段或IPv6的下一个头部字段,来决定接下来调用哪个协议来处理。常见的协议字段有:1(ICMP)、2(IGMP)、4(IPv4)、6(TCP) 和 17(UDP)

然后到达了传输层以后,大部分的协议会通过端口号来分解到对应的应用中去。端口号是一个16位的非负整数(范围:0 ~ 65535),常见的端口号有:22(SSH)、20和21(FTP)、23(Telnet)、25(SMTP)、53(DNS)、80(HTTP)、443(HTTPS) 等

HTTP协议

HTTP是一个基于“请求与响应”模式的、无状态应用层协议

HTTP是一个客户端服务器模型(B/S)客户端发起请求(Request),服务器回送响应(Response)

无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。

HTTP协议是采用URL作为定位网络资源的标识。
格式:http://host:[port]/[path]

http: 传输协议

常?的传输协议是 http 和 https,它们是限制用户与服务器间传输数据的方式与规则。http是常见协议,不安全。https是一种加密协议,HTTP下加入SSL层。

规则:建?连接通道 相互通信 关闭连接通道

host:主机域名/IP

合法的Internet主机域名或IP地址。简单来说,服务器就是另一台有许多文件可以访问的主机,域名就代表着那个主机的 IP 地址。

port:端口号

端口号是一个16位的非负整数,常见的端口号有:22(SSH)、20和21(FTP)、23(Telnet)、25(SMTP)、53(DNS)、80(HTTP)、443(HTTPS)

  • 知名端口:

知名端?是众所周知的端?号,范围从0到1023。80端?分配给HTTP服务 21端?分配给FTP服务。可以理解为,?些常?的功能使?的号码是固定的,好? 电话号码110、 10086、10010?样

  • 动态端口:

动态端?的范围是从1024到65535;之所以称为动态端?,是因为它?般不固定分配某种服务,?是动态分配。动态分配是指当?个系统进程或应?程序进程需要?络通信时,它会向主机申请?个端?,主机从可?的端?号中分配?个供它使?。 当这个进程关闭时,同时也就释放了所占?的端?号。

?台拥有IP地址的主机可以提供许多服务,?如HTTP(万维?服务)、FTP(?件传输)、SMTP(电?邮件)等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的?络服务呢?显然不能只靠IP地址,因为IP地址与?络服务的关系是?对多的关系。实际上是通过“IP地址+端?号”来区分不同的服务的

然鹅,端?并不是??对应的。?如你的电脑作为客户机访问?台WWW服务器时, WWW服务器使?“80”端?与你的电脑通信,但你的电脑则可能使?“3457”这样的端?。

path

请求资源的路径

HTTP协议对应操作

image-20210627160814918

最好按惯例”对所发送的内容要求严一点,对所接收的内容宽容一些” 来处理扩展方法

image-20210627173235443

B/S&C/S

C = Client, S = Server。C/S 架构即“客户端-服务器” 架构。这里的“客户端”可以是有 GUI (图形用户界面)的定制软件,也可以是浏览器,甚至可以是通过 SSH 访问服务器的命令行脚本。只要是客户端通过访问服务器调取计算或者存储资源的,统统都是 C/S 架构。

所谓的 Browser-Server 架构其实是 C/S 架构的一种特殊的实现形式,而不是其对立面.

web服务器

Web服务器(Web Server)是软件工具,用于提供HTTP\HTTPS的网络访问服务

常用的Web服务器有:

Apatch(a patchy server):是Apache软件基金会的一个开放源码的网页服务器。
Nginx(engine x):是一款高性能的HTTP和反向代理web服务器。
Node.js:是一个基于Chrome V8的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O的模型。
Tomcat:Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
IIS(Internet Information Services):由微软公司提供的基于运行Microsoft Windows的互联网基本服务
BEA Weblogic:美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。

服务器访问流程

  1. 地址解析

    如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm 从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下: 协议名:http 主机名:localhost.com 端口:8080 对象路径:/index.htm

    在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。

  2. 封装HTTP请求数据包

    把以上部分结合本机自己的信息,封装成一个HTTP请求数据包

  3. 封装成TCP包,建立TCP连接(TCP的三次握手)

    在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口

  4. 客户机发送请求命令

    建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。

    img
    GET

    ? ?于获取资源 ? 对服务器数据不进?修改 ? 不发送 Body【不发送内容

    GET /users/1 HTTP/1.1
    Host: api.github.com
    
    POST

    ? 用于增加或修改资源 ? 发送给服务器的内容写在Body里面【发送内容

    POST /users HTTP/1.1
    Host: api.github.com
    Content-Type: application/x-www-form-urlencoded //👈表单
    Content-Length: 13
    name=rengwuxian&gender=male
    👆body信息(表单)
    

PUT——纯写入。PUT方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名
新文档, 或者, 如果那个URL已经存在的话, 就用这个主体来替代它。

  1. 服务器响应

    服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码【状态码】,后边是MIME信息包括服务器信息、实体信息和可能的内容。 实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

    img
  2. 服务器关闭TCP连接

    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持TCP连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP状态码

服务器接到请求后,会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

分类分类描述
1**CONTINUE信息,服务器收到请求需要请求者继续执行操作
2**成功,操作被服务器成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

常见的HTTP状态码:

  • 1xx:临时性消息。如:100(继续发送)、101(正在切换协议)

? 2xx:成功。最典型的的是200(OK)、201(创建成功)

? 3xx:重定向。如:301(永久移动)302(暂时移动)、304(内容未改变)

? 4xx:客户端错误。如:400(客户端请求错误)、401(认证失败)、403(被禁止)、404(找不到内容)

? 5xx:服务器错误。如:500(服务器内部错误)

缓存cache与缓冲buffer

cookie

Cookie是由服务器发送的key-value标示符。因为HTTP协议是无状态的,但是服务器要区分到底是哪个用户发过来的请求,就可以用Cookie来区分。当一个用户成功登录后,服务器发送一个Cookie给浏览器,例如user=ABC123XYZ(加密的字符串)...,此后,浏览器访问该网站时,会在请求头附上这个Cookie,服务器根据Cookie即可区分出用户。

Cookie还可以存储网站的一些设置,例如,页面显示的语言等等。

Socket

通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

客户端编程

我们要创建一个基于TCP连接的Socket,可以这样做:

# 导入socket库:
import socket

# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))
  • AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6
  • SOCK_STREAM指定使用面向流的TCP协议

建立TCP连接后,我们就可以向新浪服务器发送请求,要求返回首页的内容:

# 发送数据:
s.send(b'GET / HTTP/1.1\r\n
Host: www.sina.com.cn\r\n
Connection: close\r\n\r\n')

TCP连接创建的是双向通道,双方都可以同时给对方发数据。但是谁先发谁后发,怎么协调,要根据具体的协议来决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。

接下来就可以接收新浪服务器返回的数据了:

# 接收数据:
buffer = []
while True:
    # 每次最多接收1k字节:
    d = s.recv(1024)
    if d:
        buffer.append(d) #append:补在后面
    else:
        break
data = b''.join(buffer)

接收数据时,调用recv(max)方法,max表示一次最多接收指定的字节数,因此,在一个while循环中反复接收,直到recv()返回空数据,表示接收完毕,退出循环。

接收完数据后,调用close()方法关闭Socket,这样,一次完整的网络通信就结束了:

# 关闭连接:
s.close()
  1. 创建socket s=socket.socket(xx.a,xx.b)
  2. 建立连接 s.connect(‘域名’,端口号)
  3. 发送请求 s.send(b’PUSH /xxx)
  4. 接收数据 buffer= []{ xxx}
  5. 关闭连接 s.close()

接收到的数据包括HTTP头和网页本身,我们只需要把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件:

header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:
    f.write(html)

服务器编程

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:51:11  更:2021-07-13 17:52:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:43:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码