一.web通信流程

在开始学web服务器之前,需要先理解web通信协议,才能够更好的吸收其中精华。

我们平时浏览⽹⻚的时候,会打开浏览器,输⼊⽹址后按下回⻋键,然后就会显示出你想要浏览的内容。在这个看似简单的⽤户⾏为背后,到底隐藏了些什么呢?

  • 浏览器本身是⼀个客户端,当你输⼊URL的时候,⾸先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP
  • 然后通过IP地址找到IP对应的服务器后,要求建⽴TCP连接
  • 等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包
  • 服务器调⽤⾃身服务,返回HTTP Response(响应)包;
  • 客户端收到来⾃服务器的响应后开始渲染这个Response包⾥的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。

⼀个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。

这个客户端通常指的是Web浏览器。

web服务器工作原理

Web服务器的⼯作原理可以简单地归纳为:

  • 客户端通过TCP/IP协议建⽴到服务器的TCP连接
  • 客户端向服务器发送HTTP协议请求包,请求服务器⾥的资源⽂档
  • 服务器向客户端发送HTTP协议应答包,如果请求的资源包含有动态语⾔的内容,那么服务器会调⽤动态语⾔ 的解释引擎负责处理“ 动态内容”,并将处理得到的数据返回给客户端
  • 客户端与服务器断开。由客户端解释HTML⽂档,在客户端屏幕上渲染图形结果

客户端请求到达服务端流程

  • 当客户端拿到服务端域名对应的ip后,浏览器会以一个随机端口(1024<随机端口<65535)向服务器的web程序(nginx、apache)的80端口发起tcp连接请求。
  • 该请求经过复杂的网络环境后到达服务端,进入到服务器的对应的网卡,再进入到linux内核的tcp/ip协议栈,一层一层的解开数据包,甚至经过防火墙,最终到达nginx程序,确认tcp/ip连接。
  • 确认tcp连接之后,客户端继续发起http请求,如常见的get、post请求方法。

小结

因此你会发现,web通信原理中,主要分两块协议的建立

  • tcp/ip
  • http

client工作流程

web基础协议_IP

TCP/IP协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

简单说就是TCP协议就是控制数据包在传过过程中的规范格式。

IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。

设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。

根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

TCP/IP协议指的不仅仅是tcp、和ip这两个协议。

而是由FTP、SMTP、TCP、UDP、IP等各种协议组成的协议簇,但是TCP/IP最最具有代表性,因此俗称TCP/IP协议。

web基础协议_客户端_02

OSI七层模型

提到tcp/ip协议,就不得不学一下OSI七层模型。

web基础协议_TCP_03

TCP/IP三次握手

web基础协议_客户端_04

讲解 TCP 三次握手和四次握手之前,我们先了解一下 TCP 和 UDP 这两个重量级的传输层协议。

用户数据报协议 UDP(User Datagram Protocol):

  • UDP 在传送数据之前不需要先建立连接,远程主机在收到 UDP 报文后,不需要给出任何确认。
  • 虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等

传输控制协议 TCP(Transmission Control Protocol):

  • TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
  • TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、流量控制、拥塞控制机制,在数据传完后,还会四次挥手断开连接用来节约系统资源),这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。
  • TCP 一般用于文件传输、发送和接收邮件、远程登录等场景

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

经典的问题,你了解TCP/IP的三次握手

四次挥手ma

具体数据包的报文格式,暂时不用过多去琢磨;

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

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

web基础协议_IP_05

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连接

web基础协议_客户端_06

web基础协议_IP_07

web基础协议_TCP_08

web基础协议_客户端_09

web基础协议_IP_10

抓包工具,查看四次挥手

理论知识,固然确实重要,得先记住理论的流程,然后再去动手实践,得出真知。。

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

web基础协议_客户端_11

二.常见端口号

常用的熟知端口号

应用程序

FTP

TFTP

TELNET

SMTP

DNS

HTTP

SSH

MYSQL

熟知端口

21,20

69

23

25

53

80

22

3306

传输层协议

TCP

UDP

TCP

TCP

UDP

TCP

TCP

TCP

三.什么是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协议工作原理

这些内容,都是你部署网站,后续的nginx高级知识点,必备的内容

无状态

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

比如你去找到禁用谷歌浏览器的cookie功能,

1.你去禁用这个功能后

2. 你每次登录淘宝网, 再打开一页面,网站又提示你需要登录

这是网站为了解决无状态实现的技术

web基础协议_TCP_12

cookie

三.后续HTTP知识

请求方法

定义client发给server的请求,是什么类型

  • get获取静态数据(查看一个图片)
  • post 发送提交一些数据 (登录表单,提交账户密码数据)
  • ...一堆方法,看博客即可

请求、响应报文查看

通过F12即可查看,也可以通过抓包工具查看

响应状态码

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