热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTTP、PHPFPM、与握手协议

HTTP请求的流程梳理用户输入url如http:www.baidu.com到浏览器,浏览器如chrom需要将其解析为ip地址才知道需要到哪里去访问哪个服务器。浏览器解析DNS步骤如
HTTP请求的流程梳理
  1. 用户输入url如http:www.baidu.com到浏览器,浏览器如chrom需要将其解析为ip地址才知道需要到哪里去访问哪个服务器。浏览器解析DNS步骤如下

    1. 搜索浏览器自身的dns缓存,这个缓存缓存时间短,缓存数目有限。
    2. 搜索操作系统的dns缓存
    3. 读取host文件的dns映射(一般做本地开发映射都是修改这个文件来达到拦截浏览器请求到本地服务器的目的,从而使本地可以成功映射服务器地址)
    4. 先本地网卡配置里的dns服务器发起域名解析请求,这里好像还有一套运营商的处理流程就不在展开了。
    5. 下面好像还有一些流程,由于基本不会执行到这一步,一般所以dns运营商的dns服务器都会搞定的。
    6. 解析失败,以上任何一步成功都会返回一个成功的ip地址
  1. 浏览器以一个随机的端口享这个ip地址的特定端口(默认80)发起著名的TCP3次握手。关于一个http请求是如何到达nginx服务的流程大致如下:
  2. 握手完成后的浏览器和服务器就可以愉快地发送http请求了,具体在nginx上流程如下:

《HTTP、PHP-FPM、与握手协议》

PHP-FPM在服务端出来请求中扮演了什么角色

PHP、nginx与CGI协议

对于一个PHP的web程序来说,web服务器(如:nginx)要想与它通信需要通过CGI协议。当一个web请求触达web服务器时,web服务器会创建一个CGI进程,CGI进程将web的请求按照固定的格式进行解析,然后写入标准输入(STDIN)和环境变量中,然后PHP启动的CGI解析器会从标准输入(STDIN)和环境变量中读取http请求的数据,所以$_SERVER才会有数据,然后做出相应的逻辑处理,然后将处理结果放入标准输出(STDOUT),CGI进程从STDOUT中读取响应数据然后传输给浏览器,这样服务端就完成了一次http请求。

上面是CGI的实现流程,但是使用CGI协议的服务器在用户每次访问服务器的时候都需要fork/销毁CGI进程,必然照成多余的系统开销,所以FASTCGI就是为了解决这个问题的。

什么是FastCGI协议

FastCGI会创建一个常驻的master进程和多个worker进程,master进程负责管理和为worker进程反派任务,worker进程负责内部嵌入了CGI解析器用于解释php代码。

PHP-FPM是一个FastCGI进程管理器,在LNMP体系中就是由它来实现FastCGI协议的。同样,它也会创建一个常驻的master进程和多个worker进程,master进程负责监听端口和接收来自nginx的请求,指派任务给worker进程。worker进程的负责解释php代码。PHP-FPM可以通过配置预先启动一定数量的worker进程,这样当http请求触达时就可以更快速的响应。

Nginx关于FastCGI的配置

nginx与PHP-FPM之间的通信一般通过其ngx_http_fastcgi_module模块来实现。其中fastcgi_pass用于设置fastcgi服务器的IP地址;fastcgi_param设置传入fastcgi服务器的参数。这个模块出现的配置问题一般集中在这一块。

相对于并发状态下出现的问题,一般也都集中在fastcgi服务器上,具体表现为fastcgi服务器为了应对大量的http请求必须不停的fork新的worker进程,这时就需要考虑服务器可支持的最大链接数和最大打开文件数(可通过ulimit -n查看)以及php-fpm配置里的最低开启worker数和最高开启worker数的限制。高性能服务器可以在这个方向上调优。

HTTP协议三次握手四次挥手的细节

协议过程中客服端与服务端的状态图

《HTTP、PHP-FPM、与握手协议》

TCP的标志位说明

标志位英文说明
SYNsynchronous建立联机
ACKacknowledgement确认
PSHpush传送
FINfinish结束
RSTreset重置
URGurgent紧急
Sequence numbe–顺序号码
Acknowledge number–确认号码

TCP状态说明

状态说明
LISTEN侦听状态
SYN_SEND发送连接请求[SYN=J]后等待匹配连接请求
SYN_RECEIVED收到连接请求[SYN=J]后发送连接确认包[SYN=k,ack=J+1]后等待收到确认包[Ack=k+1]状态
ESTABLISHED打开连接后,可以开始传输数据
FIN_WAIT_1发起连接中断请求[FIN=M]后等待远程TCP确认时[Ack=M+1]状态
FIN_WAIT_2收到远程中断确认[Ack=M+1]后,等待远程中断请求[FIN=N]
CLOSE_WAIT收到连接中断请求[FIN=M]后未发送出中断确认包[Ack=M=1]状态
TIME_WAIT发送确认远程中断请求[Ack=N+1]包后,进入等待状态,用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制

大量TIME_WAIT的原因「常见性能异常」

在四次挥手断开连接中,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),TIME_WAIT状态下的socket不能被回收使用.

具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务.

TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。一般产生的原因是系统没有主动关闭连接,如mysql连接资源没有关闭

关于网络链路中追踪异常用到的运维命令

(以下显示的IP和端口均为假数据)

Linux中查看socket的状态

cat /proc/net/sockstat

《HTTP、PHP-FPM、与握手协议》

参数说明
sockets:used已使用的所有协议套接字总量
TCP:inuse正在使用(正在侦听)的TCP套接字数量。其值≤ netstat –lntgrep ^tcpwc –l
TCP:orphan无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数)
TCP:tw等待关闭的TCP连接数。其值等于netstat –antgrep TIME_WAITwc –l
TCP:alloc已分配(已建立、已申请到sk_buff)的TCP套接字数量。其值等于netstat –antgrep ^tcpwc –l
TCP:mem套接字缓冲区使用量
UDP:inuse正在使用的UDP套接字数量
FRAG使用的IP段数量

查看当前tcp链接情况

netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

《HTTP、PHP-FPM、与握手协议》

参数说明
LISTEN正在监听状态
CLOSE_WAIT对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭
ESTABLISHED建立连接,正在通信
TIME_WAIT我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT

tcp工具抓取网络请求包

tcpdump -n port 3306mysql 主动断开链接

11:38:45.693382 IP 172.18.0.3.3306 > 172.18.0.5.38822: Flags [F.], seq 123, ack 144, win 227, options [nop,nop,TS val 3000355 ecr 2997359], length 0 # MySQL发送fin包给我
11:38:45.740958 IP 172.18.0.5.38822 > 172.18.0.3.3306: Flags [.], ack 124, win 229, options [nop,nop,TS val 3000360 ecr 3000355], length 0 # 我回复ack给它
11:38:45.740960 IP 172.18.0.3.3306 > 172.18.0.5.38822: Flags [F.], ack 125, win 231, options [nop,nop,TS val 3000360 ecr 3000355], length 0 # MySQL发送fin包给客户端
11:38:45.740965 IP 172.18.0.5.38822 > 172.18.0.3.3306: Flags [.], ack 125, win 229, options [nop,nop,TS val 3000360 ecr 3000355], length 0 # 客户端回复ack给我
……

src > dst: flags data-seqno ack window urgent options
# 发生了 3次握手
11:38:15.679863 IP 172.18.0.5.38822 > 172.18.0.3.3306: Flags [S], seq 4065722321, win 29200, options [mss 1460,sackOK,TS val 2997352 ecr 0,nop,wscale 7], length 0
11:38:15.679923 IP 172.18.0.3.3306 > 172.18.0.5.38822: Flags [S.], seq 780487619, ack 4065722322, win 28960, options [mss 1460,sackOK,TS val 2997352 ecr 2997352,nop,wscale 7], length 0
11:38:15.679936 IP 172.18.0.5.38822 > 172.18.0.3.3306: Flags [.], ack 1, win 229, options [nop,nop,TS val 2997352 ecr 2997352], length 0

参数说明
src > dst表明从源地址到目的地址
flags是TCP包中的标志信息,S 是SYN标志, F(FIN), P(PUSH) , R(RST) “.”(没有标记)
data-seqno是数据包中的数据的顺序号
ack是下次期望的顺序号
window是接收缓存的窗口大小
urgent表明数据包中是否有紧急指针
options是选项

传送门


推荐阅读
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  •   1、确认自己的线路是否连接正确腾达a9设置。 ... [详细]
  • HTTP协议相关的网络经典五层模型
    网络通信相关概念的讲解–网络协议分层(经典五层模型)在我们了解HTTP相关内容之前我们先来了解一下“网络协议分层”相关内容,因为这个是我们了解HTTP相关内容的前提条件;大家有一 ... [详细]
author-avatar
手机用户2602920905
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有