超文本传输协议(HTTP,HyperText Transfer Protocol),是一种建立在TCP上的的无状态连接,整个基本的流程是,客户端发送一个HTTP请求,说明客户想要访问的资源和请求动作,服务器接收到请求之后,服务端开始处理请求,并根据请求访问服务端的资源,然后通过htpp响应把结果返回到客户端,一个请求的开始到一个请求的结束称为事务。当一个事务结束后,还会在服务端添加一个日志。
1、http1.0 与服务端建立连接后,每次只能访问一个web资源。
2、http2.0 与服务器建立连接后,每次可以访问多个web资源。
HTTP请求是客户端往服务端发送请求,告知服务器自己的要求。
客户端连上服务端之后,向服务端请求了一个web资源就叫做一个http请求。
HTTP请求由请求头,状态行,请求体三个部分组成。
状态行:包括请求方式Method,资源路径URL,协议版本Version;
请求头:包括访问的域名,用户代理,cookie登信息
请求体:就是HTTP请求的数据
HTTP请求:
1、状态行
状态行中的GET表明就是请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT。常用的请求方式为POST和GET。
用户如果没有设置,那么默认都是以GET方式来请求,比如在网上点击的超链接等等。
GET与POST的区别.
传输数据大小的区别:
GET:请求的数据容量比较小一般不超过1k,谷歌浏览器限制请求的url长度是8182个字符.
POST:请求的数据容量没有限制,Tomcat下默认为2M,可以取消Tomcat的限制。在conf->server.xml中取消
提交方式的区别:
GET:直接在地址栏中提交到服务端.不安全
POST:提交的数据在消息主体中,不再地址栏中直接显示比较安全。
2、请求头
Accept:告诉服务端它所支持的数据类型
Accept-Encoding:告诉服务端所支持的压缩格式
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
Connection:告诉服务端请求后是断开连接还是保持连接
服务器收到客户端发来的HTTP请求后,根据HTTP请求的动作要求,服务器做出具体的动作,将结果回应给客户端,称为HTTP响应。
HTTP响应由三部分组成:状态行,响应头,响应正文
状态行:包括协议版本Version 状态码 Status Code,回应短语
响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式登信息
响应正文:响应的具体数据
HTTP响应:
1、状态行:
HTTP版本号 +状态码
常见状态码的含义
200---OK/请求已经正常处理完毕
301---/请求永久重定向
302---/请求临时重定向
304---/请求被重定向到客户端本地缓存
400---/客户端请求存在语法错误
401---/客户端请求没有经过授权
403---/客户端的请求被服务器拒绝,一般为客户端没有访问权限
404---/客户端请求的URL在服务端不存在
500---/服务端永久错误
503---/服务端发生临时错误
2、常用的响应头:
Content-Type:服务端返回数据的类型
Accept-Ranges:
ETag:与Accept_Ranges来实现断点续传
Date:响应的时间
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
在学习握手之前我们先看一下TCP首部报文格式:
流程:
我们可能会这样想,为什么不是两次握手我想服务端建立连接,服务器确认后便进入了ESTABLISHED转态,然后客户端收到服务端的确认报文后,便也进入建立连接的转态,然后双方便开始数据传输。还是因为安全问题,这样想有这样的一种情况,我们第一次向服务端发送连接请求但是呢,由于网络阻塞没有能够及时的到达服务端,这个请求被滞留了,但是后来网络通畅的我们又向服务端发送了一次请求成功并且关闭了。这时,之前滞留的那个请求到了服务端,然后服务端就进入了建立连接的转态,但是确认报文的时候,返回到客户端,此时我们的客户端已经不需要了建立连接了。这时服务端就会处于建立连接的转态,并且没有手段取消,这样就造成了不必要的浪费。
首先我们知道的是客户端与服务端都可以释放连接,在释放之前双方都是处于ESTABLISHED状态的,然后客户端主动关闭,服务端被动关闭。
1、保证TCP协议的全双工连接能够可靠关闭
2、保证这个连接的重复数据段在网络消失
TCP中存在一个保活定时器,每次服务端只要接收到客户端传送过来的信息,这个保活定时器就会复位(置零),这时我们的客户端出现故障了,保活定时器计时(大概2小时),服务端还没接收到客户端的消息,这时服务端会向客户端发一组探测报文,每隔大概70分钟,连续发10次,如果还是没有接收到客户端的消息,就会关闭这个连接。
图片来源:《深入分析Java Web技术内幕》
这张图为我们展示了一次完整的DNS解析的过程。
首先我们先了解一下服务器的相关概念:
Local DNS server(本地域名服务器):一般都是给你提供网络服务的单位(电信,移动,学校等单位)。离你不是太远
Root DNS server(根域名服务器):根服务器主要用来管理互联网的主目录。所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理,负责全球互联网域名根服务器、域名体系和IP地址等的管理。全世界只有13台根域名服务器。其中10台在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。(百度百科)
gTLD server(顶级域名服务器):某个国家,或者大型网站(教育,商业等)比如(.cn. com .eu)等.
Name server:一般是你所注册域名的那家域名服务提供商(万网等等)。
TTL:全称为(Time To Live)生存时间,简单的来说就是DNS记录在DNS服务器上的储存时间。
当我们在浏览器中输入www.tao.com的时候,DNS大致有十个步骤。
第一步:浏览器会从缓存中查找是否该域名解析的对应的IP地址,如果有那么DNS解析结束。如果没有则继续执行。(域名缓存的时间是通过TTL的属性来进行设置的)
第二步:如果浏览器的缓存中没有找到,那么会在操作系统的缓存中查找是否存在对应的域名解析的结果,windows下载C:\Windows\System32\drivers\etc下查找是否存在。(linux)这两步都是在本地机器上进行的如果都没有查询到,才会向域名服务器发起请求。
第三步:我们的网络配置中可以查看我们的域名解析服务器的地址,windows下在DOS命令行下输入 ipconfig /all可以查看(linux)。前面两个过程无法完成的话,那么操作系统会把这个域名发送给该DNS域名解析服务器,也就是Local DNS Server。一般的DNS域名解析到这里基本上就完成了。
第四步:如果本地的域名服务器的缓存中没有存在该域名解析的IP地址,那么本地服务器会向Root DNS server请求解析。
第五步:RDNS服务器返回给本LDNS一个所要查询的gTLDS(主域名服务器)地址。
第六步:LDNS根据RDNS返回的主域名服务器的地址,对其发送请求。
第七步:gTLD server 返回给本地服务器一个Name server服务器地址。
第八步:LDNS根据gTLDserver返回的Name server服务器地址对其发送请求。
第九步:Name server 会查询储存的域名和IP地址的映射表,并返回给LDNS服务器对应的查询结果和一个TTL的值。
第十步:LDNS 会根据Name server 返回的结果与TTL的值,对结果在本地服务器上进行缓存。然后把结果与TTL的值发送给用户。同样浏览器也会相应的对结果进行缓存。
Windows与Linux下都可以用nslookup来查询域名解析对应的过程.
Linux下跟踪:
A记录:A代表的是Address,它用来指定域名对应的IP地址,A记录可以将多个域名解析为一个IP地址,但是不可以将一个域名解析到多个IP地址。
CNAME记录:即:别名记录。这种记录允许您将多个名字映射到同一台计算机。 通常用于同时提供WWW和MAIL服务的计算机。例如,有一台计算机名为“host.mydomain.com”(A记录)。 它同时提供WWW和MAIL服务,为了便于用户访问服务。可以为该计算机设置两个别名(CNAME):WWW和MAIL。
NS记录:NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
TXT记录:TXT 记录,一般指为某个主机名或域名设置的说明。
要清除首先我们要学会查看一下我们的浏览器与操作系统的缓存:
windows下dos命令行输入:ipconfig /display
浏览器下(谷歌):在地址栏中输入:chrome://chrome-urls/可以查看所有的配置.
点击dns进入既可以查看。
上面的是我在学校的机房试的,学校的浏览器的版本太低了,我在我自己的电脑上是在地址栏中输入:chrome://net-internals/#dns
就可以,并且如果清除的话,会有一个按钮直接清除。
windows下清除dns缓存:(在windows下输入:ipconfig/flush)