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能高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多.

一次完整的http请求过程以及网络I/O模型select、epoll的更多相关文章

  1. 一次完整的 HTTP 请求过程

    一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端, ...

  2. 一个完整的HTTP请求过程详细

    整个流程1.域名解析 —> 2.与服务器建立连接 —> 3.发起HTTP请求 —>4. 服务器响应HTTP请求,浏览器得到html代码 —> 5.浏览器解析html代码,并请求 ...

  3. 在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)

    在浏览器中输入URL后,执行的全部过程.会用到哪些协议?(一次完整的HTTP请求过程) 整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起 ...

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

    转载:https://blog.51cto.com/linux5588/1351007 当我们在浏览器的地址栏输入 www.linux178.com,然后回车,回车这一瞬间到看到页面到底发生了什么呢? ...

  5. 面试题之----一次完整的HTTP请求过程

    当我们在浏览器的地址栏输入 www.linux178.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢? 以下过程仅是个人理解: 域名解析 --> 发起TCP的3次握手 --> ...

  6. 在浏览器中输入URL后,执行的全部过程。(一次完整的http请求过程)

    整个流程如下: 域名解析 为了将消息从你的PC上传到服务器 上.需要用到1P协议.ARP协议和0SPF协议 发起TCP的3次握手 建立TCP连接后发起http请求 服务器响应htp请求 浏览器解析ht ...

  7. 【面试题】在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)

    整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起TCP的三次握手 建立TCP连接后发起HTTP请求 服务器响应HTTP请求 浏览器解析h ...

  8. Nginx处理请求过程

    1. worker进程工作机制  现在我们了解了当我们在操作nginx的时候,nginx内部做的一些事情,那么worker进程又是如何处理请求的呢?   我们前面有提到,worker进程之间是平等的, ...

  9. http一次请求过程

    物理层:支持底层网络协议: 其中网络层支持IP协议: 传输层支持TCP协议,它是面向连接的: 应用层支持 http,ftp  tftp,SMTP,DHCP协议 一个完整的http请求过程: 1.浏览器 ...

随机推荐

  1. Altium Designer入门学习笔记2:使用原创客3D元件库

    请自行淘宝购买: 元件库列表(2018年11月27日): 问题一:在项目库或已安装的库中找不到? 将"原创客"提供的文件全部添加到libraries中!"原创客" ...

  2. CodeForces 599E Sandy and Nuts 状压DP

    题意: 有一棵\(n(1 \leq n \leq 13)\)个节点的树,节点的标号为\(1 \sim n\),它的根节点是\(1\). 现在已知它的\(m(0 \leq m < n)\)条边,和 ...

  3. java处理excel

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  4. luogu1169 [ZJOI2007]棋盘制作

    悬线法 #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  5. Selenium WebDriver- 通过源码中的关键字找到我们要操作的句柄,用于多个窗口之间切换

    #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...

  6. day01_04.变量

    变量的命名规则 变量名由字母小写a-z,大写A-Z,_下划线,数字0-9组成,php的变量名区分大小写;python的变量名也是区分大小写的 注意: PHP变量名必须以美元$符号开始; 变量名开头可以 ...

  7. NVIDIA NVML Driver/library version mismatch

    sudo rmmod nvidia_drm sudo rmmod nvidia_modeset sudo rmmod nvidia_uvm sudo lsof /dev/nvidia* confirm ...

  8. 聊聊、Spring 第一篇

    Spring 大家都不陌生,企业应用中很流行的一个平台.从最开始的 Servlet 控制所有,到 MVC 模式的出现.从 SSH (Struts.Spring.Hibernate) 所谓的三剑客 到 ...

  9. [automator篇][5]Viewer 提示connect to adb fail

    7. UIAutomatorViewer提示: Unable to connect to adb. Check if adb is installed correctly 解决,sdk升级到了25产生 ...

  10. 【转】Linux多命令顺序执行连接符(; || && |)

    当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果.下面我们总结一下,加以区分. (1)  ;  分号,没有任何逻辑关系的连接符.当多个命令用分号连接时,各命令之间的 ...