Fork me on GitHub

一次完整的http请求过程以及网络I/O模型select、epoll

a.一次完整的http请求过程

1.域名解析,得到域名对应的IP;

2.三次握手,客户端与服务器通过socket建立TCP/IP连接;

3.浏览器向服务器发送http请求,如:GET/index.html HTTP/1.1;

4.浏览器发送请求头信息,请求内容,最后会发送空白行,表示客户端请求完毕;

5.服务器处理请求:读取参数并进行逻辑操作后,生成指定的数据;

6.服务器做出应答,如:HTTP/1.1 200 OK(协议的版本号和应答状态码);

7.服务器发送应答头信息;

8.服务器发送数据:

服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息发送结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据;

9.tcp连接关闭

  一般情况下,一旦Web服务器向发送了客户端请求的数据,它就要关闭TCP连接,如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求,保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽,但会降低服务器性能.

  像上面这种写法,是大多数博客上通用的写法,不仅啰嗦,而且还给人一种像是在背书的感觉,下面是我重新整理之后的总结:

1.域名解析,得到域名对应的IP;

2.三次握手,建立TCP/IP连接;

3.客户端向服务器发送HTTP请求报文,此时已经建立了HTTP连接;

4.服务器向客户端发送HTTP响应报文;

5.关闭TCP连接.

请求报文格式说明
请求行-1.请求方法(GET);2.URL(/index.html);3.协议版本(HTTP/1.1)
请求头-字段名1:值1;字段名2:值2...
请求头信息
Accept:image/gif,image/jpeg(媒体类型)
Accept-Language:zh-cn(语言类型)
Accept-Encoding:gzip(支持压缩)
User-Agent(客户端类型)
Host:www.baidu.com(主机名) 
空行:最后一个请求头部信息之后是一个空行,发送回车符和换行符,通知Web服务器,空行以下不会再有请求头的信息了
请求报文主体-GET方法没有请求报文主体;POST方法才有,因为POST方法会向服务器发送数据.

响应报文的一般格式
起始行-1.协议及版本号;2.数字状态吗;3.状态信息.
响应头部-字段名1:值1;字段名2:值2...
响应头信息
Content-Type:text/html;charset=utf-8
Content-Length:78
空行:最后一个响应头部信息之后是一个空行,发送回车符和换行符,通知Web服务器,空行以下不会再有响应头的信息了
响应报文主体

b.SYN攻击

  在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态,当收到ACK后,服务器转入ESTABLISHED状态.

  Syn攻击就是:攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,

  这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪.

  Syn攻击是一个典型的DDOS攻击.检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击:netstat -np TCP | grep SYN_RECV

  一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现.主要方法有SynAttackProtect保护机制、SYN cookies技术增加最大半连接缩短超时时间等.但是不能完全防范syn攻击.

 

http请求过程1:https://www.cnblogs.com/ddddemo/p/5624053.html

http请求过程2:https://blog.csdn.net/liudong8510/article/details/7908093

TCP的三次握手与四次挥手:https://blog.csdn.net/qzcsu/article/details/72861891

更详细的三次握手四次断开:https://www.cnblogs.com/zmlctt/p/3690998.html

c.正向代理和反向代理

正向代理:代理服务器代理内网用户访问外网;

反向代理:代理外网用户访问内网.

  nginx做反向代理:代理服务器为A,内网服务器为B,A把请求转发给B,B处理后,将数据交给A,A再把数据发送给用户;

  LVS做负载均衡器:负载均衡器为A,内网服务器为B,A把请求转发给B,B处理后,直接把数据发送给用户,效率略微高点.

nginx作为Web服务器的主要应用场景:

1.使用nginx运行HTML、JS、CSS、图片等静态数据(类似于lightpd);

2.nginx结合FastCGI运行PHP等动态程序(例如使用fastcgi_pass);

3.nginx结合tomcat/resin等支持Java动态程序(常用proxy_pass).

d.网络I/O模型--nginx使用epoll,Apache使用select

  select的调用复杂度是线性的,即O(n).举例:一个保姆照看一群孩子,如果把每个孩子是否需要吃饭,比作网络I/O事件,select的工作原理就好比:这个保姆挨个询问每个孩子:你要吃饭么?如果孩子回答:是,则把孩子领出来放到另外一个地方.当所有孩子询问完毕之后,保姆领着这些要吃饭的孩子去吃饭(去处理网络I/O事件);

  epoll机制下,保姆不再需要挨个询问每个孩子,而是谁需要吃饭,就主动站到事先约定好的地方,如果有小孩,就带着小孩去吃饭.因此epoll能高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多.

 

posted @ 2018-12-24 20:18  法外狂徒  阅读(1155)  评论(0编辑  收藏  举报