图解HTTP读书笔记(一)

图解HTTP读书笔记(一)

最近要用到一些网络通信方面的知识,不是很懂,于是找来《图解HTTP》来看,这是一本很简单的入门书,图文并茂,通俗易懂。怕忘记,便进行了笔记整理与扩充。

网络基础 TCP/IP

TCP/IP 协议族是互联网相关联的协议的集合。而HTTP是属于它内部的一个子集。其中,HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。

TCP/IP 的分层管理

TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。
分层的好处:

  1. 规划好各层之间的接口部分,能够自由改动每个层次内部的设计。
  2. 层次化之后,设计也变得相对简单。处于应用层上的应用可以只考虑分派给自己的任务,而无需弄清对方在地球上哪个地方、对方的传输路线、是否能确保传输送达等问题。
  • 应用层:决定了向用户提供应用服务时通信的活动。
    TCP/IP 协议族预存了各类通用的应用服务。如 FTP(文件传输协议)、DNS(域名系统)和 HTTP。

  • 传输层:提供处于网络连接中的两台计算机之间的数据传输。有TCP(传输控制协议)和 UDP(用户数据报协议)两个不同的协议。

  • 网络层:处理在网络上流动的数据包。数据包是网络传输的最小数据单位。网路层的协议:IP(Inernet Protocol)

  • 链路层:处理连接网络的硬件部分。

TCP/IP 通信传输流如下图所示。
TCP/IP 通信传输流

与HTTP关系密切的协议:IP、TCP和DNS

负责传输的 IP 协议

IP(网际协议)位于网络层,用于把各种数据包传送给对方。
IP 地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。
可采用ARP协议凭借MAC地址进行通信。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。

确保可靠性的TCP协议

TCP位于传输层,提供可靠的字节流服务。
字节流服务是指:为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。

三次握手(建立连接)

为了准确无误地将数据送达目标处,TCP协议在发送数据的准备阶段采用了三次握手策略。
三次握手建立连接,数据传送过程中,发送端发包,接收端收包之后会发送一个确认包,否则发送端会再发包,如下图所示。

三次握手建立连接
Client主动打开连接,Server被动打开连接。

  1. 客户端发送不携带数据的SYN包(序号seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认。
  2. 服务器收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送一个不携带数据的SYN包(序号seq=y),即SYN+ACK包,此时服务器进入SYN_RCVD状态。
  3. 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

四次握手(释放连接)

与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”,如下图所示。
四次握手释放连接
当客户端为主动关闭方,服务器为被动关闭方时,

  1. 客户端发送一个FIN,用来关闭客户端到被服务器的数据传送,也就是客户端告诉服务器:我已经不会再给你发数据了,但是,此时客户端还可以接受数据。此时,客户端进入FIN-WAIT-1状态。(注意:在FIN包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据。)
  2. 服务器收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1,(TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。)此时,服务器进入CLOSE-WAIT状态。此刻处于半关闭状态,即客户端没有数据要发送了,但若服务器仍有数据要发送,客户端还要接收;客户端收到服务器的确认后,进入FIN-WAIT-2状态。
  3. 当数据传完后,服务器发送一个FIN,用来关闭服务器到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。服务器进入LAST-ASK状态;
  4. 客户端收到FIN后,发送一个ACK给服务器,确认序号为收到序号+1,进入TIME-WAIT状态,当经过2MSL时,客户端进入CLOSED状态,至此,完成四次挥手。

面试题1:为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

面试题1:为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
当Client发送出最后的ACK回复,但该ACK可能丢失时,Server若没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

负责域名解析的 DNS 服务

DNS服务提供域名到IP地址之间的解析服务,是应用层的协议。
DNS提供通过域名查找IP地址,或逆向从IP地址反查域名服务。

各种协议与HTTP协议的关系

下图展示了IP、TCP协议和DNS服务在使用HTTP协议的通信过程中各自发挥的作用。
http通信

URI/URL

URI(Uniform Resource Identifier):统一资源定位符。
它是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源所使用的协议类型名称,如http、ftp。
URI 用字符串标识某一个互联网资源,而URL表示资源的地点。URL是URI的子集。
下图为绝对URI的格式:
绝对URI的格式

猜你喜欢

转载自blog.csdn.net/hanxiucaolss/article/details/88831069