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. Python学习笔记:py2exe打包Python程序

    使用py2exe将一个Python程序打包成一个exe程序,这样Python程序也可以在没有安装Python的环境中运行Python程序了.使用这个工具需要写一个用于打包的setup.py文件(名称可 ...

  2. vue创建路由,axios前后台交互,element-ui配置使用,django contentType组件

    vue中创建路由 每一个vue组件都有三部分组成 template:放html代码 script:放js相关 style:放css相关 vue中创建路由 1.先创建组件 Course.vue 2.ro ...

  3. Docker工具

    虚拟化 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源, 如服务器.网络.内存及存储等,予以抽象.转换后呈现出来, 打破实体结构间的 ...

  4. SQL防止重复提交和Filter

    /class User package com.neuedu.bean; import java.io.Serializable; public class User implements Seria ...

  5. cf 1020 C

    C. Elections time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  6. Linux优化总结

    1)netstat (*****)查看网络状态lntup或an 1.[listening|-l] 2.[--numeric|-n] 3.[--tcp|-t] 4.[--udp|-u] 5[--prog ...

  7. flask_关注者

    表的模型实现 class Follow(db.Model): __tablename__ = 'follows' follower_id = db.Column(db.Integer,db.Forei ...

  8. poj 3281 Dining(网络流+拆点)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20052   Accepted: 8915 Descripti ...

  9. Python中的魔法函数__repr__和__str__的实质性区别

    str 和 repr 方法:是自定义类的字符串描述,这两种都是比较 Pythonic 的方式去控制对象转化为字符串的方式. 调用这两个方法,返回的都是字符串.但是这两个方法又有一些区别 ** 1 两种 ...

  10. TCP缓冲区大小及限制

    这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数据报大小IPv4的数据报最大大小是65535字节,包括IPv4首部.因为首部中说明大小的字段为16位.IPv6的数 ...