DNS
域名解析
首先浏览器拿到我们的url,会将我们的url解析出来,然后拿到域名部分,由于我们的包在互联网上传输是根据ip地址来寻找下一个转发点,所以如果我们以我们的域名来当作地址显然是不可能的。所以浏览器会拿到我们的域名然后通过我们设备内置的dns处理模块去附近最近的dns服务器去查找该域名对应的ip地址,如果找不到,再去其他的dns服务器查找,最终将查找到的ip地址放到我们的请求头部,而不是我们的域名。
(ping www.baidu.com)该指令可用来查看域名的ip
域名查找的过程,主要是根据域名的分级,一级一级的去找,这就是域名分级的作用。下面给一张dns解析的过程图
TCP
连接
客户端(浏览器)通过TCP传输协议
建立到服务器的TCP连接 ,该过程称为三次握手,过程如下。
- 先Client端发送连接、请求报文。让服务器知道我要发起连接
- Server端接受连接后回复ACK报文,并为这次连接分配资源。表示服务器知道你要发送数据,并且准备好接收数据
- Client端接收到ACK报文后也向Server端发送ACK报文,并分配资源,这样TCP连接就建立了。可以开始发送数据
发送数据
客户端(浏览器)向web服务器端(HTTP服务器)发送HTTP协议包
,请求服务器里的资源文档 (telnet 模拟)
接收数据
服务器向客户端发送HTTP协议
应答包
断开连接
等到数据发送完毕,客户端就会主动发起断开连接,这个过程叫做四次挥手,过程如下
- Client端发起中断连接请求,也就是发送FIN(结束)报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭(Socket),可以继续发送数据。
- server发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续等我的消息"。
wait:这个时候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连接就这样关闭了!
TCP、UDP、http、https
是什么
面向连接的TCP
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。
面向非连接的UDP
协议
“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。与手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
应用层协议http https
等
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
我们传输数据时使用的就是这些协议
http
请求与响应报文
请求报文
-
请求行
- 格式: 请求方法(GET POST DELETE HEAD TRACE OPTION等) 请求资源 (URL) 请求协议版本(HTTP/1.1)
-
请求头
- 参考该链接
-
请求体
- 这里一般是我们要发送的各种格式的数据,例如表单数据
name=aimee&age=18
- 这里一般是我们要发送的各种格式的数据,例如表单数据
响应报文
请求方法 GET POST HEAD
- GET 使用URL(
?a=xx&b=xx
)或Cookie传参,不能将数据放到请求体中去,如果放到请求体当中,数据是发不出去的。而对于POST要将数据放在BODY中。即xhr.send(data)
- GET 的URL会有长度上的限制,所以传参上面会有限制,而POST可以传输很多数据,虽然它也有大小限制但是能传输的数据比GET多得多。之所以传输数据都有限制是为了防止恶意攻击,保护服务器的安全性。
- POST比GET安全(其实只是对于非专业人士来说而已,打开控制台都一目了然)。
-
HEAD
方法用于获取响应头,不能把数据放到body
中,响应中也不会有数据部分,就算服务器端放了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。