HTTP-边学边记

Posted 小占成莉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP-边学边记相关的知识,希望对你有一定的参考价值。

假设我们在浏览器中输入http://www.baidu.com,baidu.com为我们要访问的服务器

  3)客户端的网络层不用关系应用层或者传输层的东西主要做的是通过查找路由表确定如何到达服务器期间可能经过多个路由器这些都是由路由器来完成的工作不作过多的描述无非就是通过查找路由表决定通过那个路径到达服务器

  计算机网络学习的核心内容就是网络协议的学习网络协议为计算机网络中进行数据交换而建立的规则标准或约定的集合因为不同用户的数据终端可能采取的字符集是不同的两者需要进行通信必须要在一定的标准上进行

1. 网络层次划分

  为了使不同计算机厂家生产的计算机能够相互通信以便在更大的范围内建立计算机网络国际标准化组织(ISO)1978年提出了开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层其中第四层完成数据传送服务上面三层面向用户

2. OSI七层网络模型

  1)物理层(Physical Layer)

  激活维持关闭通信端点之间的机械特性电气特性功能特性以及过程特性该层为上层协议提供了一个传输数据的可靠的物理媒体简单的说物理层确保原始的数据可在各种物理媒体上传输物理层记住两个重要的设备名称中继器(Repeater,也叫放大器和集线器

  2)数据链路层(Data Link Layer)

  有关数据链路层的重要知识点

  1> 数据链路层为网络层提供可靠的数据传输

  2> 基本数据单位为帧

  3> 主要的协议以太网协议

  4> 两个重要设备名称网桥和交换机

  3)网络层(Network Layer)

  网络层的目的是实现两个端系统之间的数据透明传送具体功能包括寻址和路由选择连接的建立保持和终止等它提供的服务使传输层不需要了解网络中的数据传输和交换技术如果您想用尽量少的词来记住网络层那就是路径选择路由及逻辑寻址”。

  1> 网络层负责对子网间的数据包进行路由选择此外网络层还可以实现拥塞控制网际互连等功能

  2> 基本数据单位为IP数据报

  3> 包含的主要协议

  IP协议(Internet Protocol,因特网互联协议);

  ICMP协议(Internet Control Message Protocol,因特网控制报文协议);

  4> 重要的设备路由器

  4)传输层(Transport Layer)

  第一个端到端即主机到主机的层次传输层负责将上层数据分段并提供端到端的可靠的或不可靠的传输此外传输层还要处理端到端的差错控制和流量控制问题

  传输层的任务是根据通信子网的特性最佳的利用网络资源为两个端系统的会话层之间提供建立维护和取消传输连接的功能负责端到端的可靠数据传输在这一层信息传送的协议数据单元称为段或报文

  有关网络层的重点

  1> 传输层负责将上层数据分段并提供端到端的可靠的或不可靠的传输以及端到端的差错控制和流量控制问题

  2> 包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议);

  3> 重要设备网关

  5)会话层

  会话层管理主机之间的会话进程即负责建立管理终止进程之间的会话会话层还利用在数据中插入校验点来实现数据的同步

  6)表示层

  表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解表示层的数据转换包括数据的加密压缩格式转换等

  7)应用层

  为操作系统或网络应用程序提供访问网络服务的接口

  会话层表示层和应用层重点

  1> 数据传输基本单位为报文

  2> 包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议邮局协议),HTTP协议(Hyper Text Transfer Protocol)。

  4)255.255.255.255

  5)0.0.0.0

4. 子网掩码及网络划分

  什么是子网掩码

  子网掩码的计算

  下面总结一下有关子网掩码和网络划分常见的面试考题

  1)利用子网数来计算

  在求子网掩码之前必须先搞清楚要划分的子网数目以及每个子网内的所需主机数目

  (1) 将子网数目转化为二进制来表示;

  (2) 取得该二进制的位数N;

  该二进制为五位数,N = 5

  2)利用主机数来计算

  (1) 将主机数目转化为二进制来表示

  700=1010111100;

  该二进制为十位数,N=10;

  10+1+1+1=13

  因为13小于16(16等于24次方),所以主机位为4256-16=240,所以该子网掩码为255.255.255.240。

5. ARP/RARP协议

  ARP工作流程举例

  RARP协议工作流程

  (4)如果不存在,RARP服务器对此不做任何的响应

6. 路由选择协议

  常见的路由选择协议有:RIP协议、OSPF协议

  RIP协议 :底层是贝尔曼福特算法它选择路由的度量标准(metric)是跳数最大跳数是15如果大于15它就会丢弃数据包

  OSPF协议 :Open Shortest Path First开放式最短路径优先底层是迪杰斯特拉算法是链路状态路由选择协议它选择路由的度量标准是带宽延迟

7. TCP/IP协议

  TCP是面向连接的通信协议通过三次握手建立连接通讯完成时要拆除连接由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务采用带重传的肯定确认技术来实现传输的可靠性。TCP还采用一种称为滑动窗口的方式进行流量控制所谓窗口实际表示接收能力用以限制发送方的发送速度

  TCP报文首部格式

  TCP协议的三次握手和四次挥手

  :seq:"sequance"序列号;ack:"acknowledge"确认号;SYN:"synchronize"请求同步标志;;ACK:"acknowledge"确认标志";FIN:"Finally"结束标志

  TCP连接建立过程首先Client端发送连接请求报文,Server端接受连接后回复ACK报文并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文并分配资源这样TCP连接就建立了

  TCP连接断开过程假设Client端发起中断连接请求也就是发送FIN报文。Server端接到FIN报文后意思是说"Client端没有数据要发给你了",但是如果你还有数据没有发送完成则不必急着关闭Socket,可以继续发送数据所以你先发送ACK,"告诉Client你的请求我收到了但是我还没准备好请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态继续等待Server端的FIN报文Server端确定数据已发送完成则向Client端发送FIN报文,"告诉Client好了我这边数据发完了准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了但是他还是不相信网络Server端不知道要关闭所以发送ACK后进入TIME_WAIT状态如果Server端没有收到ACK则可以重传。“,Server端收到ACK,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复则证明Server端已正常关闭那好Client端也可以关闭连接了。Ok,TCP连接就这样关闭了

  为什么要三次挥手

  在只有两次握手的情形下假设Client想跟Server建立连接但是却因为中途连接请求的数据报丢失了Client端不得不重新发送一遍这个时候Server端仅收到一个连接请求因此可以正常的建立连接但是有时候Client端重新发送请求不是因为数据报丢失了而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了这种情形下Server端将先后收到2次请求并持续等待两个Client请求向他发送数据...问题就在这里,Cient端实际上只有一次请求Server端却有2个响应极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待因而造成极大的资源浪费所以,“三次握手很有必要

  为什么要四次挥手

  试想一下假如现在你是客户端你想断开跟Server的所有连接该怎么做第一步你自己先停止向Server端发送数据并等待Server的回复但事情还没有完虽然你自身不往Server发送数据了但是因为你们之前已经建立好平等的连接了所以此时他也有主动权向你发送数据Server端还得终止主动向你发送数据并等待你的确认其实说白了就是保证双方的一个合约的完整执行

  使用TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(SMTP相对用于接收邮件)、HTTP协议等

8. UDP协议 

  UDP用户数据报协议是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息由于通讯不需要连接所以可以实现广播发送。UDP通讯时不需要接收方确认属于不可靠的传输可能会出现丢包现象实际应用中要求程序员编程验证

  UDPTCP位于同一层但它不管数据包的顺序错误或重发因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务例如NFS。相对于FTPTelnet,这些服务需要交换的信息量较小

  每个UDP报文分UDP报头和UDP数据区两部分报头由四个16位长(2字节字段组成分别说明该报文的源端口目的端口报文长度以及校验值


  使用UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。

  TCP  UDP 的区别:TCP是面向连接的可靠的字节流服务;UDP是面向无连接的不可靠的数据报服务

9. DNS协议

详细参考维基百科:https://zh.wikipedia.org/wiki/域名系统

10. NAT协议

11. DHCP协议

常见状态码

 

200 OK                        //客户端请求成功

400 Bad Request               //客户端请求有语法错误不能被服务器所理解

401 Unauthorized              //请求未经授权这个状态代码必须和WWW-Authenticate报头域一起使用 

403 Forbidden                 //服务器收到请求但是拒绝提供服务

404 Not Found                 //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error     //服务器发生不可预期的错误

503 Server Unavailable        //服务器当前不能处理客户端的请求一段时间后可能恢复正常

多状态码 http://www.runoob.com/http/http-status-codes.html

 

HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法

HTTP1.0定义了三种请求方法:GET, POST  HEAD方法

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE  CONNECT 方法

 

GET     请求指定的页面信息并返回实体主体

HEAD     类似于get请求只不过返回的响应中没有具体的内容用于获取报头

POST     向指定资源提交数据进行处理请求例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改

PUT     从客户端向服务器传送的数据取代指定的文档的内容

DELETE      请求服务器删除指定的页面

CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

OPTIONS     允许客户端查看服务器的性能

TRACE     回显服务器收到的请求主要用于测试或诊断

HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型客户端向服务器发送一个请求报文请求报文包含请求的方法、URL、协议版本请求头部和请求数据服务器以一个状态行作为响应响应的内容包括协议的版本成功或者错误代码服务器信息响应头部和响应数据

以下是 HTTP 请求/响应的步骤

1、客户端连接到Web服务器

一个HTTP客户端通常是浏览器Web服务器的HTTP端口默认为80)建立一个TCP套接字连接例如,http://www.oakcms.cn。

2、发送HTTP请求

通过TCP套接字客户端向Web服务器发送一个文本的请求报文一个请求报文由请求行请求头部空行和请求数据4部分组成

3、服务器接受请求并返回HTTP响应

Web服务器解析请求定位请求资源服务器将资源复本写到TCP套接字由客户端读取一个响应由状态行响应头部空行和响应数据4部分组成

4、释放连接TCP连接

connection 模式为close,则服务器主动关闭TCP连接客户端被动关闭连接释放TCP连接;connection 模式为keepalive,则该连接会保持一段时间在该时间内可以继续接收请求;

5、客户端浏览器解析HTML内容

客户端浏览器首先解析状态行查看表明请求是否成功的状态代码然后解析每一个响应头响应头告知以下为若干字节的HTML文档和文档的字符集客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化并在浏览器窗口中显示


3、浏览器发出读取文件(URL 中域名后面部分对应的文件)HTTP 请求该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

4、服务器对浏览器请求作出响应并把对应的 html 文本发送给浏览器;

5、释放 TCP连接;

6、浏览器将该 html 文本并显示内容


GETPOST请求的区别

GET请求

GET /books/?sex=man&name=Professional HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Connection: Keep-Alive

注意最后一行是空行

 

POST请求

POST / HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 40

Connection: Keep-Alive

 

name=Professional%20Ajax&publisher=Wiley

1、GET提交请求的数据会附在URL之后就是把数据放置在HTTP协议头中),?分割URL和传输数据多个参数用&连接 :login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字原样发送如果是空格转换为+,如果是中文/其他字符则直接把字符串用BASE64加密得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

 

POST提交把提交的数据放置在是HTTP包的包体中上文示例中红色字体标明的就是实际的传输数据

 

2、传输数据的大小首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制

而在实际开发中存在的限制主要有

GET:特定浏览器和服务器对URL长度有限制例如 IEURL长度的限制是2083字节(2K+35)。对于其他浏览器Netscape、FireFox理论上没有长度限制其限制取决于操作系 统的支持

因此对于GET提交时传输数据就会受到URL长度的 限制

POST:由于不是通过URL传值理论上数据不受 但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置

 

3、安全性

POST的安全性要比GET的安全性高比如通过GET提交数据用户名和密码将明文出现在URL因为(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录那么别人就可以拿到你的账号和密码了除此之外使用GET提交数据还可能会造成Cross-site request forgery攻击

keep-alive

https://www.cnblogs.com/havenshen/p/3850167.html

1、HTTP Keep-Alive在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。keepalvie timeoutHttpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。

2、TCP KEEPALIVE链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。

3、http keep-alive与tcp keep-alivehttp keep-alive与tcp keep-alive,不是同一回事,意图不一样。http keep-alive是为了让tcp活得更久一点,以便在同一个连接上传送多个http,提高socket的效率。而tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。tcp keep-alive保鲜定时器,支持三个系统内核配置参数:1 echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time2 echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl3 echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probeskeepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。

也就是说,仅当nginx的keepalive_timeout值设置高于tcp_keepalive_time,并且距此tcp连接传输的最后一个http响应,经过了tcp_keepalive_time时间之后,操作系统才会发送侦测包来决定是否要丢弃这个TCP连接。一般不会出现这种情况,除非你需要这样做。

4、图解http的keep-alive

map用法:

使用MFC:包含cstringt.h;不使用MFC:包含atlstr.h  或者 #include <afx.h> 

冷知识1:

printf()中的f 代表什么意思?

以上是关于HTTP-边学边记的主要内容,如果未能解决你的问题,请参考以下文章

windbg 边学边记

Python | 边学边敲边记第四次:初识爬虫框架Scrapy

R语言边学边记8-缺失值处理与转换函数

推荐28个网站,让你边玩边学

Github重磅教程!从0到1,边学边实战!

javaFX学习 面板手册--1