相关概念介绍:
http是应用层协议,依赖于传输层tcp协议进行传输。
IANA:
(The Internet Assigned Numbers Authority)互联网数字分配机构
0-1023:永久分配给固定应用使用,特权端口,只有管理员能够启动应用进行监听;
1024-41951:注册端口,分配给某应用使用。
41952+:客户端程序随机使用的端口,称之为动态端口或私有端口。其范围定义在/proc/sys/net/ipv4/ip_local_port_range文件中
BSD Socket:
IPC(Inter-Process Communication,进程间通信)的一种实现,允许位于不同主机(或同一台主机)上的进程之间进行通讯。
Socket API:(封装了内核中socket通信相关的系统调用)
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW:raw套接字(裸套接字)
根据套接字所使用的格式,Socket Domain:
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主机上不同进程基于socket套接字通讯使用的一种地址Unix_SOCK
TCP FSM:3次握手 --已建立连接--> 4次断开的详细过程
参考fw0124大神博客:http://blog.csdn.net/fw0124/article/details/7452695
TCP协议特征:
(1)面向连接的、可靠的传输层协议;
(2)TCP协议建立在不可靠的网络层IP协议上,IP不能提供任何可靠机制,TCP的可靠性完全由自己实现;
(3)端到端的通信;
(4)全双工方式传输;(两条虚连接线路)
TCP采用的最基本的可靠性技术:
确认与超时重传
流量控制
http
hyper text transfer protocol,是一种应用层协议,默认80/tcp
注意:http是文本协议!
html:hyper text mark language,超文本标记语言
html格式:
<html> <head> <title> </title> </head> <body> <a href="http://....">...</a> </body> </html>
css:Cascading Style Sheet
js:JavaScript,客户端脚本,通过客户端浏览器进行解析运行
协议版本:
http/0.9
http/1.0:引入了cache,MIME,method
MIME:Multipurpose Internet Mail Extesion,本是一种邮件协议,引入到http协议后使http能够传输非文本数据
method:数据传输的请求方法(如提交表单用到的post、get方法,head、put、delete、trace、options等)
http/1.1:增强了缓存功能
http/2.0:
工作模式:
http request,http请求报文
http response,http响应报文
一次http请求与响应的过程叫做一次http事务。
web resource,web资源
静态资源
无需服务端做出额外处理
.jpg .png .gif .html .txt .js .css .mp3 .avi
动态资源
服务端需要通过执行程序进行处理,发送给客户端执行结果
.php .jsp
注意:一个页面中展示的资源可能有多个,而每一个资源需要单独请求。
URL,资源标识符
Uniform Resource Locator,用于描述服务器某资源的位置
Scheme://Server_IP[:Port][/PATH]
如:
http://mirror.aliyun.com
加速页面打开;
浏览器开启多线程
浏览器缓存
完整的http请求处理过程:
(1)建立或处理连接
(2)接收请求
(3)处理请求
(4)访问资源
(5)构建响应报文
(6)发送响应报文
(7)记录日志
接收请求的模型:
并发访问响应模型:
单进程I/O模型(效率太低,不可用):
单进程网络I/O,启动一个进程处理用户请求,一次处理一个请求,多个请求被串行响应。
多进程I/O结构(prefork):
并行启动多个进程,每个进程响应一个请求。
复用I/O结构:
即一个进程响应n个请求
多线程模式(worker):
一个进程生成n个线程,一个线程处理一个请求
事件驱动(event):
一个进程直接响应n个请求
复用多进程I/O结构:
启动多个进程,每个进程再生成多个进程
处理请求:
主要操作为分析请求报文的http请求报文首部
请求报文首部格式:
<method></URL><VERSION> HEADERS:(name:value)... <request body>
访问资源:
获取请求报文中请求的资源
web服务器:
存放了web资源的主机,负责向请求者提供对方请求的静态资源或动态资源运行结果。
这些资源通常放置于本地文件系统某路径下,此路径称为DocRoot。
web服务器资源路径映射方式:
a. DocumentRoot
b. alias
c. 虚拟主机的DocumentRoot
d. 用户家目录的DocumentRoot
http请求处理的连接模式:
保持连接(长连接):keep-alive
保持客户端与服务器之间的连接,不是每个资源都进行tcp的三次握手四次断开
非保持连接(短连接):
每个资源的都需要tcp的三次握手四次断开的步骤。(注意四次断开第3步服务器回应客户端断开请求后,不会立即请求与客户端断开,而是等待一段时间,而如果这段时间客户端再次请求了与服务端连接,则会继续使用此虚连接)
http服务器程序:
http(apache)
nginx
lighttpd
应用程序服务器:
IIS:.net
tomcat:.jsp
httpd安装与使用:
官方站点:httpd.apache.org
ASF:apache software foundation阿帕奇软件基金会
包名:httpd
进程名:httpd
httpd特征:
高度模块化
core + modules
DSO:
dynamic shared object(动态对象)
MPM:
Multipath processing Modules(多路处理模块)
典型的有:
prefork(默认)
多进程模型。每个进程响应一个请求。
主进程(一个):
子进程(多个):
主进程(仅有一个)生成/回收子进程(多个),创建套接字,接收请求,并派发给子进程,由子进程处理请求。
会预先生成多个空闲子进程,随时等待响应用户请求。可设置最大/最小空闲进程。
worker
多线程多进程模型。每个线程响应一个请求。
主进程(一个):
子进程(多个):
线程(多个):
event
事件驱动模型。多进程,每个进程响应多个请求。
主进程(一个):
子进程(多个):
注意:在http 2.2版本中仍为测试使用;而在2.4版本中为稳定功能,可用于生产环境。
httpd版本:
httpd 1.3:官方停止维护
httpd 2.0
httpd 2.2:centos6默认版本
httpd 2.4:centos7默认版本,最新稳定版,能动态装载多路处理模块。
httpd功能特性:
CGI:Common Gateway Interface
虚拟主机
IP
Port
FQDN
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
httpd安装:
rpm包
编译安装
http协议(2)
URL:Uniform Resource Locator
scheme IP:Port PATH
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数值传递
如:http://www.grub2.com/bbs/hello;gender=f
query:查询语句使用到的变量值传递
如:http://www.grub2.com/bbs/search?username=tom&title=abc
frag:传递本页锚定标识传递
类型:
相对URL:一般在本地站点资源的引用时使用,避免由于站点域名改变而导致资源无法访问。
绝对URL:一般在其他站点资源的引用时使用。
http协议特征:
stateless:无状态跟踪
在未设置"KeepAlive On"时,由于每个资源都需要经过tcp的"三次握手四次断开",所以服务器无法持续追踪访问者来源,即不能判断不同请求是否由同一客户端发出。即使设置了"KeepAlive On"之后,由于"KeepAliveTimeout 15"的设置,服务器也不可能花费太多时间与一个客户端保持持久连接,而连接一旦断开,依旧无法分辨客户端是谁。而假如是需要登录才能访问的资源,这种情况将反复提示用户输入账号信息。
cookie:
为了使服务器识别不同的客户端,服务端会在客户端留下一些记录信息,后续访问时,客户端将cookie信息发给服务端,服务器便能够识别了。
类别:
胖cookie
记录用户的浏览记录等大量信息
轻cookie
只记录客户端标识信息,配合服务端的session来保存用户状态信息。
session:
关联至客户端cookie。动态网站用于保存客户端状态信息的。
http事务:
http协议的一次请求与响应的过程。理解http事务及http报文语法格式,以便对报文进行分析后,进行不同的操作。
请求:request
响应:response
报文语法格式:
request报文:
<method><request-URL><version>
<headers> ...
空行
<entity-body>
response报文:
<version><status><reason-phrase>
<headers> ...
空行
<entity-body>
method:
请求方法,标明客户端希望服务器端对资源的执行动作
GET:从服务器获取一个资源;这时<entity-body>部分通常为空
HEAD:请求只从服务器获取资源响应首部,而不需要服务器端发送<entity-body>
POST:向服务器发送要处理的数据,而这些数据都是存放在<entity-body>中的
PUT:将请求的主体部分直接存储在服务器上,而不是交给服务器处理,数据在<entity-body>中。这时客户端应该对服务器有存取权限才行。
DELETE:请求删除服务器上的指定资源
TRACE:追踪请求报文到达服务器过程中经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法
提示:
可以使用telnet命令来测试。
telent IP Port
method /URL version
Host: IP
回车
version:
HTTP/<major>.<minor>
status:
三位的数字,标记请求过程状态码
1xx:
100-101:信息提示
2xx:
200-206:成功
3xx:
300-305:重定向
4xx:
400-415:客户端错误
5xx:
500-505:服务端错误
常用状态码:
200:成功(OK)。请求数据已通过响应报文的entity-body发出。
301:永久重定向(Moved Permanently)。请求的URL指定资源已被删除;但会通过响应报文的首部指明Location的值,以标明资源现在所处的新位置。
302:临时重定向。与301类似,但通过响应报文首部指明的Location的值指明的是资源的临时新位置。
304:客户端发出条件式请求请求获取资源是否发生过修改,而服务器上的资源未发生改变的响应。
401:需要认证(Unauthorized)。资源存在,需要客户端提供认证信息。
403:请求被禁止(Forbidden)。权限不足
404:资源找不到(Not Found)。
500:服务器内部错误(Internal Server Error)。
502:代理服务器从后端服务器收到了一条伪相应(Bad Gateway)。
reason-phrase:
状态码所标记状态的简要描述
如:200-->OK 404-->NOT FOUND
headers:
每个请求/响应报文可包含0或多个headers。每个headers都有名称,后跟冒号 可选空格 值。(多个值空格隔开)
首部的分类:
通用首部
可以用在请求/相应报文首部
Date:报文创建时间
Connection:连接状态,如keep-alive、close
Via:报文经过的中间节点
Cache-Control:控制缓存
Pragma:与http1.0兼容的控制缓存相关
请求首部
仅可以用在请求报文首部
Accept:可接收媒体类型
Accept-Charset:可接收编码格式
Accept-Encoding:可接收编码格式,如gzip
Accept-Language:可接收的语言
Client-IP:客户端IP
Host:请求的服务器名称和端口号
Referer:当前请求资源的上级资源,常用来分析网站入口来源
User-Agent:客户端代理,即浏览器类型,可通过此条显示不同网页给客户端
条件式请求首部:
Expect:期望发送的信息
If-Modified-Since:指定时间至今,请求的资源是否发生过修改。
If-Unmodified-Since:
If-None-Match:本地缓存中存储的资源Etag标签是否不匹配服务器中的资源Etag标签。
If-Match:
安全请求首部:
Authorization:向服务器发送认证信息,如账号密码
Cookie:客户端向服务器发送cookie
Cookie2:
代理请求首部:
Proxy-Authorization:向代理服务器认证
响应首部
信息类:
Age:相应持续时长
Server:服务程序名称及版本
协商首部:
当某资源有多种表示方法时使用
Accept-Ranges:服务器可接收的请求类型范围
Vary:服务器查看的其他首部列表
安全响应首部:
Set-Cookie:向客户端设置cookie
Set-Cookie2:
WWW-Authenticate:服务端对客户端的质询认证表单
实体首部
描述<entity-body>部分
Allow:列出对此资源可使用的请求方法
Location:回应客户端真正的实体位置
Content-Encoding:资源编码格式
Content-Language:
Content-Length:
Content-Location:资源真正的实体位置,与Location一样
Content-Type:返回格式为 major/minor
缓存相关:
Etag:资源扩展标签
Expires:资源过期时间
Last-Modified:最后修改时间
扩展首部
entity-body:
附加的数据,可能为空。
协议查看或分析工具:
tcpdump、tshark、wireshark