http服务无论nginx还是httpd都需要先创建套接字,把对应的套接字绑定在响应的接口上,开启此端口的监听状态,开启accpet,接收远程用户的访问。
客户端也是,通过创建自己的套接字,通过connect函数,来连接服务器,最终相互之间传输数据,最后断开连接
http通过tcp报文封装数据包,往下传送给网络层封装报文头部,数据链路层再封装,到达另外的就解封装、
http报文头部不同情况下不一样,分两类:
1.请求报文
2.响应报文
http是超文本传输协议
httpd是实现应用程序的两个服务器端的通信协议
html是中间传输数据的文件格式
html就是定义怎么在浏览器上实现各种字体和图片
javascript简称js,跟java没有任何关系
http早期传输文本,后来发现不同的需求,加调用了MIME,多用途互联网邮件扩展(可以支持丰富的各种文件)
早期互联网是由邮件方式沟通 的
描述大体分成两块
主要类型,细化类型
类似设备编号
http协议也是慢慢发展起来的
http早期只支持get
post上传
http协议也有直接的头部文件,是个文本文件可以看懂
content-type 就告诉用户这次传的是多媒体文件,还是文本文件,还是其他类型的文件
头部信息是文本的
现在主流是1.1,是可以持续链接不会断开的
一个TCP链接里可以发多个请求
可以用delete来管理缓存
前面回应慢,后面就可能排队等着
每次访问不会记录身份信息(一般都借助cookie,缓存来帮助你记录账号密码)
客户端向服务器发起请求
服务器端收到请求给与响应 response
每个页面有很多资源组成,每个资源都需要单独地发送请求,单独地做响应
所以一个web页面都是一组资源的组合
访问的资源又可以分为静态资源和动态资源
静态资源,服务器端文件是什么样子,到达客户端就还是什么样子,无需服务器端做其他处理
启动一个web服务
下面就对应的资源,可以理解为每个资源是独立文件
重新创建一下,可能编码机制有点问题
这样就行了,windows的编码机制和linux的不一样
访问这个文件的时候,会在外面添加应用层的报文头部,这个针对http协议,加了自己的报文头部格式
get请求
响应的部分
上面是http的报文头部,下面就是文件内容
网站的资源都是按顺序一个个下载,下载的话都从一个网站下载就太慢了,为了提高速度,减少请求不太现实,网页加载可能就先加载你窗口内的,下面的其实当你滑下去才加载,这样导致你认为你加载很快,这就是首屏加载时长
但是有可能看到的页面是,通过程序生成的页面,动态页面,.JSP,.PHP
URN(统一资源命名),P2P下载有磁力链接(不体现,你下载的资源名称和在哪个主机上)
P2P:就是在你下载的时候,找别人的机器上有没有资源,可以帮你提升下载速度。去中心化的方式。
只有一个资源名称,这个时候下载就是从互联网找相同资源的一起下载,只是决定了命名方式,而不是确定了为止
URN只是名字,URL是定位了资源在某个服务器为止,大部分URI都指URL
浏览器输入的地址就是URL的一种
schame代表协议类型,比如HTTP,FTP,HTTPS,gcomm://(mysql)
主机名可能是个FQDN www.magedu.com,也可能是个ip地址
现在京东上查手机,?cat=后面的数字就是手机的编号
https=sechma
list.jd.com =FQDN
list.html=path 路径
?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1 查询语句query
刷新一次页面
每个用户访问网站,会有一个cookieUV是根据用户来判断的,我是一个人,无论刷多少次,都是一个人,如何判断你是一个用户,系统中是利用cookie判断的,
cookie就是当用户第一次访问页面的时候,这个网站会给你发一个唯一标识,叫cookie,每次你访问的时候,服务器查看相同cookie就认为你是同一个人
排名第一百度
pv一亿8000多万,uv3000多万
谷歌15亿
**QPS每秒请求次数
pv每天的页面访问量,页面衍生连接次数(一个页面会有很多请求)/一天时间
**
面试的时候可能会让你计算公式
pv页面数(每打开一个页面刷信一下算一次,但是一个页面可能有上百个资源。所以将来计算的时候还需要转换一下,页面衍生的链接次数,一个链接就算一个资源)
PV一般按一天统计(一个PV有多少个资源)
假设一天的访问量100W*一个页面带有的资源连接次数是100个=1亿/(一天86400秒
如果一秒钟响应一次,并发链接数就等于QPS,如果2m秒响应就需要*2,等待时间越长,链接数越多
这样统计是平均的,
还有峰值的(比如美团),百分之80的访问时集中在20%的时间里的
http服务的web请求以及响应处理的流程,大概7个步骤,
1.向服务器端发送请求,建立链接,
2.建立以后,服务器应该看到客户端发送的请求了,接收用户请求,(有可能收到的用户请求不是一个,互联网并发很多用户请求,那么服务器端如何响应如何接收这些请求(后面讲,服务器收到请求,要处理请求,
3.处理用户请求(根据客户端发送请求里的http命令(get,post),来如何处理请求,不同的http版本带的命令是不一样的,大部分是get,得到一个页面文件,
4.服务器就要去替你到数据库或者磁盘上的静态文件访问资源,
5…把访问到的资源用http报文首部进行封装,构建一个响应报文,构建好后发送出去
(还要加tcp报文头头部,ip报文头部,数据链路层报文头部等等,发送出去)
6.客户端最终收到文件
7.记录日志,服务器记录下谁谁访问了(客户都发送请求,访问的这一过程)
总共7个过程
一行就是一条记录
涉及到高并发就需要配置相应web访问响应的io模型
单进程:比较理想化,服务器端开启一个进程,客户发送一个请求,就用一个进程来响应这个请求,这个进程就是为一个用户提供服务的,用户访问完,进程也就关闭了,如果有多个请求,就只能一个一个处理,第一个进程处理完了,才能处理第二个请求
大部分情况下用并行处理,多进程io模型,在web服务器开启多个进程,每个进程去响应一个用户请求,开10个进程就会响应10个用户,apache web服务默认采用的是这个模型
**第二种叫复用io模型,一个进程可以响应多个用户的请求,但是在具体实现的时候有多种方法,
多线程,就是一个进程生产多个线程,每个线程来响应用户请求(如mysql)
事件驱动,一个进程处理多个请求,没有线程,如nginx会使用(一个进程会响应多个用户请求
多线程比多进程省一点资源
**
开多个进程,每个进程响应多个链接请求,同时每个进程里开多个线程,这样最后可以处理m*N个请求
一个进程可以响应多个请求
1.单进程,一个一个处理,其他用户等待
2.apache默认模型,开4个进程,每个进程响应请求,每个进程开多少,都是有限制的
apache对于高并发的来讲,性能就受很大影响,C10K(C链接数,10K=1万),并发达到1万基本到极限了,而nginx可以达到几万,每秒20k,30k都可以
3.复用的io模型,其实是个连接池,连接池可以并发接收多个用户请求,发请求虽很多,但是很多情况下,cpu只要把文件从磁盘上拿到传给用户就可以了,很多情况下,当你发指到磁盘拿文件的时候,这个用户请求就是等待状态了,等于没有真正的数据传输,就可以响应另外一个用户请求了,大部分在响应磁盘io,cpu等于没事干,就去响应用户请求,就可以用一个进程并发的响应多个用户请求,
4。多进程io模型,无非就是打开多个连接池,然后每个连接池放一个进程,每个进程里有多个线程,并发链接多个用户请求
用户的请求报文格式和响应报文格式是不一样的
根据用户报文里请求的命令,method方法来决定怎么去处理,大部分是get,就是到磁盘上去访问数据,根据用户发的请求来决定下一步怎么做
数据报文有俩个报文,请求和响应报文,这两个格式是不同的
CRLF代表空行
大部分请求报文的实体主体是空的,但是在有些清空下,比如上传东西就会有内容
这就是首部行
下面就是i首部字段行,是键值对
开始行包含三个内容,方法+URL+ 版本,回车换行
下面就是首部字段
空行下面就没有实体了
看看能不能抓到这个信息
响应报文也是三部分,开始行,首部行,实体
开始行三个内容:版本 状态码 短语
状态码
tengine是阿里对nginx的二次封装
状态码一般是三位数字
100左右代表信息提示
200左右代表成功
300左右代表重定向
400左右代表错误类信息,客户端错误
500左右代表错误类信息,服务器端错误
具体常用的状态码
301,302很容易混淆,都属于重定向,
301 moved permanently 永久重定向
302 是临时重定向
什么http的重定向,访问京东老的域名
结果跳转重定向到了京东
http访问淘宝,结果会使用https,也算一种重定向
这两种重定向就是一个叫永久一个叫临时
301永久
hsts 限制的传输安全
302是临时重定向,跳转到https了
访问过一次页面,再次访问,页面没有修改,就会304
401身份验证的时候看到过
403是权限被拒绝了
404找不到网页
500是服务器内部错误(上次配置问题出现过
502代理服务器后端,服务器收到一条伪响应,表示无法连接到网关,一般稍微有点规模的网站都是把请求先发到调度器的,调度器再发送到服务器端,就有个问题,把用户请求调度过去,服务器却宕机了,那么作为调度器就会发送502给客户端,表示后面真实的服务器端出现了问题
lvs代理服务器看到后面服务器无法响应就会返回一个502
首部行可能会显示详细的信息
这个页面就有实体了
小i把整个过程都看到,下面就是实体