一次完整的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能高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多.
一次完整的http请求过程以及网络I/O模型select、epoll的更多相关文章
- 一次完整的 HTTP 请求过程
一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端, ...
- 一个完整的HTTP请求过程详细
整个流程1.域名解析 —> 2.与服务器建立连接 —> 3.发起HTTP请求 —>4. 服务器响应HTTP请求,浏览器得到html代码 —> 5.浏览器解析html代码,并请求 ...
- 在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)
在浏览器中输入URL后,执行的全部过程.会用到哪些协议?(一次完整的HTTP请求过程) 整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起 ...
- 一次完整的http请求过程
转载:https://blog.51cto.com/linux5588/1351007 当我们在浏览器的地址栏输入 www.linux178.com,然后回车,回车这一瞬间到看到页面到底发生了什么呢? ...
- 面试题之----一次完整的HTTP请求过程
当我们在浏览器的地址栏输入 www.linux178.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢? 以下过程仅是个人理解: 域名解析 --> 发起TCP的3次握手 --> ...
- 在浏览器中输入URL后,执行的全部过程。(一次完整的http请求过程)
整个流程如下: 域名解析 为了将消息从你的PC上传到服务器 上.需要用到1P协议.ARP协议和0SPF协议 发起TCP的3次握手 建立TCP连接后发起http请求 服务器响应htp请求 浏览器解析ht ...
- 【面试题】在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)
整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起TCP的三次握手 建立TCP连接后发起HTTP请求 服务器响应HTTP请求 浏览器解析h ...
- Nginx处理请求过程
1. worker进程工作机制 现在我们了解了当我们在操作nginx的时候,nginx内部做的一些事情,那么worker进程又是如何处理请求的呢? 我们前面有提到,worker进程之间是平等的, ...
- http一次请求过程
物理层:支持底层网络协议: 其中网络层支持IP协议: 传输层支持TCP协议,它是面向连接的: 应用层支持 http,ftp tftp,SMTP,DHCP协议 一个完整的http请求过程: 1.浏览器 ...
随机推荐
- Map容器——TreeMap及常用API,Comparator和Comparable接口
TreeMap及常用API ① TreeMap类通过使用红黑树实现Map接口; ② TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③ 不像散列(HashMap), ...
- pl/sql的控制结构,分支、循环、控制
一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...
- wpf Combobox模拟键盘按键
private void RadComboBox_PreviewKeyUp(object sender, KeyEventArgs e) { try { var obj = (RadComboBox) ...
- 九度oj 题目1465:最简真分数
题目描述: 给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合. 输入: 输入有多组,每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000. ...
- 性能学习之--loaderunner压测
打开一个脚本,tools-create Controllwer Scenario,开始场景的设计 一.场景设计--手工测试 1.初始化 2.start vu 一般选择simultaneously,用户 ...
- 【Luogu】P3332K大数查询(树套树)
题目链接 这题我费尽心思不用标记永久化终于卡过去了qwq 权值线段树下面套一个区间线段树.然后乱搞搞即可. // luogu-judger-enable-o2 #include<cstdio&g ...
- [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...
- HDU-2236 无题II
选取不同列不同行的N个数...明摆着叫你二分匹配 二分答案,然后枚举边的范围并跑匈牙利,以此判断答案范围. #include <cstdlib> #include <cstdio&g ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 【后缀数组 + 主席树 + 二分 + ST表】
题目 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职 ...
- webpack错误Chunk.entry was removed. Use hasRuntime()
这个错误在从webpack1升级webpack2或webpack3时候都遇到了,起初查到的都是extract-text-webpack-plugin版本的问题,升级了还是不管用.搜索引擎上查不到其他的 ...