web通信协议

正式进入网站部署的学习

web通信流程


client工作流程

TCP/IP协议

OSI七层网络模型


抓包工具,查看TCP/IP的三次握手

经典的问题,你了解TCP/IP的三次握手
四次挥手吗
具体数据包的报文格式,暂时不用过多去琢磨;

什么时候需要琢磨数据包的序列号,只有当你在生产环境下,遇见的及其棘手的问题,比如一些数据不同步,交易数据丢失等极端情况,需要去抓取数据包,逐个分析,数据包的完整性,序列号。

目前只需要大致了解数据包的类型,以及作用即可;


1. 抓取ssh登录的数据包,查看 tcp/ip协议基础之上的 SSH应用层协议
登录web-7机器
windows(192.168.xx.xx)  
↓
vmnet8(nat虚拟网卡,10.0.0.1)    
↓
web-7(nat 10.0.0.7)



两个ip:port的数据包交互
10.0.0.1:随机端口      >   10.0.0.7:22

wireshark大鲨鱼抓包工具查看ssh登录数据包收发情况

在window去登录 web-7


ssh远程连接,也是建立的tcp/ip的三次握手之上




2. 查看网站访问的数据包,基于 tcp/ip 基础之上的 HTTP应用层协议
由于捕捉的是 vmnet8的网卡流量,检测http协议,只能给这个网段内的机器,发http请求

这里需要注意,如果你多次访问nginx,你可能会抓不到默认的tcp三次握手
tcp三次握手,是用于首次连接的
访问nginx页面的请求,第一次以及建立好连接,默认会有一个保持连接
你后续的请求,。就不会再继续tcp三次握手,而是直接发送http请求
你和nginx服务器已经建立好tcp连接了。

使用firefox另一个浏览器,重新去建立tcp连接





抓包工具,查看四次挥手

1.先建立ssh连接,然后退出ssh会话,查看是否发出tcp/ip 的四次挥手,四个数据包

常见端口号

常用的熟知端口号

什么是socket套接字

任何,两个机器的连接,指的是tcp/ip协议的连接,本质上是两个socket的通信

socket套接字就是 ip+port的具象化

比如部署nginx服务,运行在 10.0.0.7:80 端口,这就是一个socket
通过本地去访问这个socket,浏览器随机指定的端口,发出请求

10.0.0.1:61145   这个也是一个socket

本地套接字

比如单机LNMP,应用程序在机器内部内存之间数据交互

========================================
套接字存在的意义,在于让两端进行数据交互,数据传输

php
10.0.0.7:9000

mysql(10.0.0.7:3306  这是一个ip:port形式的 socket)

mysql -uroot -p -h10.0.0.7



================================================================================
另一个形式是,也就是文件形式的本地socket
(因为本地内存文件socket形式,比网络socket传输效率更高,)
在后面高级部分,我教大家企业常用的python后端部署

socket的都是具象化证明服务的确运行了,可以对外提供访问了,可以交互了
mysql运行在 /tmp/mysql.sock

这个文件存在,则表示mysql运行
你可以通过这个/tmp/mysql.sock去登录mysql数据库


咱们暂时部署形式都是 网络socket形式,将程序部署在 ip:port的形式。。

网络套接字

部署LNMP,这是不同机器之间的远程访问,就是远程socket

比如 http协议的交互

10.0.0.1:61145  >   10.0.0.7:80

马上学习nginx反向代理,远程部署

lb-5
10.0.0.5:80      

↓

web-7
10.0.0.7:9000 (php-fpm)

叫做远程的socket通信


简单说就是你部署 10.0.0.5:80   这个服务,还会和远程的另一个服务通过网络通信 
10.0.0.7:9000
两端进行数据交互



专业名词就叫做socket通信

HTTP协议工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。

HTTP协议采用了请求/响应模型。

客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

HTTP 请求/响应的步骤

1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.yuchaoit.cn

2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。


4. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。
客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

5. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2.解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5.浏览器将该 html 文本并显示内容;  
6.释放 TCP连接;

无状态

http默认不会记住每一次连接的状态信息,下一次都会认为是一个新的客户端连接

但是如果HTTP完全无状态,你登录到淘宝网后,点击电子产品的跳转链接,它又提示你需要登录了,这就是一个无状态的实际效果。

因此此类需要保持用户身份信息的业务,必须要保存用户的状态。

于是引入了Cookie技术,能够保持用户的身份信息,下一次客户端发出请求,服务端能记忆客户端的身份。

没有cookie

有cookie

请求方法

HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:

GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据

HEAD
与GET方法一样,都是向服务器发出指定资源的请求。
只请求响应报文中的HTTP头部。
它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
如注册、登录等请求。

PUT
向指定资源位置上传其最新内容。
如更新用户信息


DELETE
请求服务器删除Request-URI所标识的资源。

TRACE
回显服务器收到的请求,主要用于测试或诊断。

OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

注意事项:

方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。

HTTP请求报文

Accept 就是告诉服务器端,我接受那些MIME类型

Accept-Encoding 这个看起来是接受那些压缩方式的文件

Accept-Lanague 告诉服务器能够发送哪些语言

Connection 告诉服务器支持keep-alive特性

Cookie 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端

Host 用来标识请求服务器上的那个虚拟主机,比如Nginx里面可以定义很多

虚拟主机.那这里就是用来标识要访问那个虚拟主机。

User-Agent 用户代理,一般情况是浏览器,也有其他类型,如:wget curl 搜引擎的蜘蛛等

If-Modified-Since 是浏览器向服务器端询问某个资源文件如果自从什么时间修

过,那么重新发给我,这样就保证服务器端资源.文件更新时,浏览器再次去

求,而不是使用缓存中的文件。

If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配;


抓包HTTP请求

HTTP响应报文


抓包HTTP响应

HTTP常见响应状态码

1. 当你client  发出 get请求 获取一个图片信息  ,发出requests


2.  server  响应结果,nginx找到这个图片,返回给用户,  response
响应信息,是有对应的状态码的。。

学习nginx会遇见的内容
- 20x系列,表示请求,响应正常解析
- 30x系列,表示本次请求,被转发到另一个服务器上了。。
- 40x系列,表示client客户端访问的url有问题,该资源不存在
- 50x系列,表示网站的服务端出错了(php-fpm)没有运行

总结梳理,面试拿出来背即可

1.dns篇
用户访问域名www.yuchaoit.cn
↓
浏览器跳转
↓
浏览器缓存(disk cache)
↓
Hosts文件
↓
本地DNS服务器(递归查询 > 迭代查询)
↓
client 向 server发起查询(递归查询)
server 向 server发起查询(迭代查询)


2.TCP/IP协议篇(三次握手)
client > SYN报文,请求连接 
server > SYN,ACK报文 响应client
client  > ACK,建立连接 


3.客户端发起http请求
- 请求方法是什么、get、post、delete
- 请求主机是什么、www.yuchaoit.cn
- 请求资源是什么 、 http://yuchaoit.cn:8090/upload/2022/05/Xnip2022-05-01_16-32-30-b82235c9b62c42af8ea25e0313ca42f7.jpg
- 请求端口是什么、默认http是80、https是443
- 请求参数是什么、请求头部信息(资源类型、是否压缩、cookie、浏览器客户端等)
- 请求信息最后的换行

4.服务端响应的内容
- server信息(web服务器软件类型)
- 响应文件类型
- 响应头部信息(是否压缩,语言编码,是否保持连接等)

5.客户端发起TCP四次挥手断开连接。
client > 发起断开请求 FIN=1 
server  > 响应断开   FIN、ACK
server  > 发起断开请求 FIN=1
client > 确认断开连接 ACK
posted @ 2024-03-17 14:00  不太聪明的大鹅  阅读(5)  评论(0编辑  收藏  举报