一次HTTP请求的背后

作者: Chauncey_Chen | 来源:发表于2016-12-13 19:03 被阅读2140次

    基础概念


    网络七层模型

    应用层

    提供网络管理、文件传输、事务处理,Telnet、FTP、HTTP、SNMP、DNS,HTTPS.在这里稍微解释下.

    HTTP

    • http0.9 是http协议的第一个版本,只有普通的get请求.

    • http1.0,引入post请求,让HTML的表单可以提交表单.引入加入请求头Header ,让
      既一次TCP连接后,可以多次通信,虽然HTTP1.0 默认是传输一次数据后就关闭。

    • http1.1,加入keep alive等.

    HTTPS:加密数据传输

    发起请求:通过443端口发起https请求
    关于HTTPS,这里有一篇不错的文章[传送门]

    宿主host:
    (主机名) 加快域名解析,当进行DNS请求时,系统会自动检查host文件是否有这个网络域名映射关系。如果有则,调用这个IP地址映射,如果没有,再向已知的DNS服务器提出域名解析。也就是说Hosts的请求级别比DNS高。
    **DNS(Domain Name System) **
    域名解析器,将域名和ip绑定

    表示层

    不同数据编码格式的转换,提供数据压缩、解压缩服务,对数据进行加密、解密。例如图像格式的显示

    会话层

    将数据组合成数据Data,建立和维持对话.

    传输层

    将数据组合成段Segment,用tcp,udp等进行数据传输.

    网络层

    分割和重新组合数据包Packet,基于网络层地址IP,进行路径选择.例如路由器.

    当前TCP/IP协议族:

    • IPv4的地址位数是32位,也就是说最多有2^32台电脑可以连接到互联网.

    • IPv6采用128位地址长度,也就是2^128台电脑可以连接.几乎可以不受限制地提供地址.除此之外,还改善了IPv4中解决不好的问题,主要有端到端IP连接、服务质量(QoS)、安全性、多播、移动性、即插即用等

    • ARP(Address Resolution Protocol) 地址解析协议(在IPv4)

    数据链接层

    在物理层上建立可靠的传输,单位是Frame.功能是:物理地址寻址,数据成帧,流量控制,数据监测等.例如网桥,交换机.
    协议包括:SDLC(sychronous Date Line Control),HDLC,PPP(Point-to-Point),STP等

    物理层

    是数据传递的实体,数据传输单位是bit,例如光纤,电缆等.


    在介绍TCP之前,先说一下UDP和TCP的区别

    • UDP传输就类似于写信,接收方事先并不知道你要写信给他;
      即无法判断在传输过程中,会不会发生丢包,阻塞,等情况.

    • TCP传输就像是打电话,必须等对方按了接听键你才能更他通话。
      TCP报文有自己的检测机制,检验、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输.

    TCP协议的特点

    TCP协议是一种面向连接的,基于字节流的传输层协议.TCP将用户数据打成报文段(如下报文图),在发送的时候启动一个定时器,在另外一端接受的时候,对数据会进行确认,排序,去重复(根据序列号,确认号比较进行确认)等操作.应用层的http,是使用TCP建立连接的.

    如果想要充分读懂TCP是如何收发包,以及序列号的,请点击[传送门]

    TCP报文首部:

    1. 源端口号:数据发起者的端口号,16bit

    2. 目的端口号:数据接收者的端口号,16bit

    3. 序号:32bit的序列号,由发送方使用,根据发送的字节数据变化

    4. 确认序号32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1。

    5. 首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。

    6. 保留:6bit, 均为0

    7. 紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。

    8. 确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。

    9. 推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。

    10. 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。

    11. 同步比特SYN:在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。

    12. 终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。

    13. 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。

    14. 检验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。

    15. 紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。

    16. 选项:长度可变,最长可达40字节


    HTTP请求流程

    时间线流程

    这里写图片描述

    网络层级关系


    请求流程分析

    解析域名(HOST/DNS)

    • 一个域名 会首先访问本地的Host文件,查看有没有域名对应的访问ip的映射
    • 如果有,就直接得到IP,如果没有,就通过DNS根服务器,
    • DNS根服务器会询问.net域名服务器,有没有此域名
    • net域名服务器会查找blog.csdn.net是否存在
    • 如果存在,就返回相应的IP地址
    • ARP协议解析ip对应的物理地址,并加入到ARP缓存
    • 进行TCP握手

    三次握手

    相互请求,相互确认的过程.

    就像长途运货车
    你和总部说,我想运货,
    然后总部收到你的短信,给你回信说:恩,收到,去吧
    你说,收到,马上去.

    在此先设定

    SYN1表示客户端的同步信号,ACK1表示客户端的确认信号,FIN1表示客户端对服务器信道停止信号

    SYN2表示服务器的同步信号,ACK2表示服务器的确认信号,FIN2表示服务器对客户端信道停止信号

    SYN根据ACK的相应而变化.使用确认号1响应服务端的序列号0

    序列号代表发送的数据编号,确认序列代表收到的数据编号.

    序列号和确认序列在握手的时候发送的时候都会自动+1(说的不太恰当);

    序列号为当前端成功发送的数据位数,确认号为当前端成功接收的数据位数,SYN标志位和FIN标志位也要占1位

    第一次:

    客户端发起请求(发送SYN1=1,ACK1=0)到服务器,此时,服务器进入'SYN_SENT'(客户端已经提交SYN报文)状态,等待服务器响应.

    第二次:

    服务器收到SYN包,确认客户端的SYN包而生成ACK(ACK=j+1)包,还有自己的一个请求编号SYN
    (SYN=k), 即发送SYN+ACK包(发送SYN2=0,ACK2=1)到客户端.此时,服务器进入'SYN_RECV'状态.

    第三次:

    客户端收到服务器的SYN+ACK包,然后,自己向服务器发送确认包ACK(发送SYN1=0+1,ACK1=0+1=1),此时,服务器进入'ESTABLISHED'(链接成功)状态,完成三次握手
    (连接完成状态表示为SYN1=1,ACK1=1,SYN2=1,ACK2=1).

    数据传输过程

    第四次(客户端请求服务器发出的有效数据包)

    这是流中第一个携带有效数据的包(确切的说,是客户端发送的HTTP请求),序列号依然为1,因为到上个包为止,还没有发送任何数据,确认号也保持1不变,因为客户端没有从服务端接收到任何数据

    需要注意的是,包中有效数据的长度为125字节,但是一共有125+1个数据,因为序列号也占用字节.

    服务端的序列号为1.确认号为1,TCP客户端的序列号为126.确认号为1

    第五次(服务器得到包,并处理得到的数据)

    当上层处理HTTP请求时,服务端发送该包来确认客户端在包4中发来的数据,需要注意的是,确认号的值增加了125(125是包4中有效数据长度),变为126,
    服务端以此来告知客户端端,目前为止,我总共收到了126字节的数据,服务端的序列号保持为1不变

    服务端的序列号为1.确认号为126,TCP客户端的序列号仍为126.确认号为1

    第六次(服务器发出数据包)

    这个包标志着服务端返回HTTP响应的开始,序列号依然为1,因为服务端在该包之前返回的包中都不带有有效数据,该包带有512字节的有效数据.

    服务端的序列号为513.确认号为126,TCP客户端的序列号仍为126.确认号为1

    第七次(客户端接受数据包)

    客户端接收到数据.到此为止,一次tcp的短连接,一次网络请求完成().
    当tcp进行长链接的时候,会不断地相互增长.
    服务端的序列号为513.确认号为126,TCP客户端的序列号仍为126.确认号为1+513=514

    连接终止协议(四次挥手)

    第一次:

    TCP的客户端发送一个FIN(FIN=1),用来关闭客户到服务器的数据传输.

    此时,将标志位FIN1=1.

    服务端的序列号为513.确认号为126,TCP客户端的序列号仍为126+1.确认号为514

    第二次:

    服务器收到这个FIN,它发出一个ACK2=1,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

    此时,FIN1=1,ACK2=1,通道1关闭,服务器确定

    服务端的序列号为513.确认号为126+1=127,TCP客户端的序列号仍为126.确认号为514

    第三次:

    服务器关闭客户端连接,发一个FIN2=1的标志位给客户端,

    此时,将标志位FIN1=1,FIN2=1.ACK2=1,通道1,2关闭,服务器确定

    服务端的序列号为513.确认号为126+1=127,TCP客户端的序列号仍为126.确认号为514

    第四次:

    客户端发回ACK1=1报文确认,并将确认序号设置为收到序号加1。

    此时,FIN1=1,ACK2=1,ACK1=1,ACK2=1,通道1,2关闭,客户端确认,服务端确认.连接关闭

    服务端的序列号为513.确认号为126+1+1=128,TCP客户端的序列号为126+1=127(最终序列号).确认号为514

    附软件截图

    总结

    1.正常网络连接的实质都是TCP连接下的bit流的传输(没有考虑UDP等).

    2.一个网络请求,过程复杂,需要跨过网关,解析域名,TCP握手,各种缓存策略,协议和报文等机制复杂.

    3.HTTP协议,所有信息都是公开的,容易被第三方获取.HTTPS运用了SSL加密,对称,非对称,hash加密等.

    4.三次握手的意义在于,双方都进行了确认后再代开连接,防止已经链接失效,或者因为网络延时造成的重复分组.造成建立新的tcp链接,造成service一直等待,浪费资源.

    5.四次挥手的原因是,TCP是全双工,因此每个方向都必须单独关闭.收到一个FIN,代表这个信道,在此之后不会传输数据.但是一个TCP连接在发出FIN之前,收到一个FIN后仍能发送数据.

    6.协议在不断地更新换代,效率越来越高!

    相关文章

      网友评论

      • fdbe996636d0:很受益
        Chauncey_Chen: @院长卡卡 谢谢
      • 车远之:收藏
        Chauncey_Chen: @车远之 一起学习
      • 叮宕:总结:互联网的根基是一个一个的包,即包交换,包从上到下来的,再从下到上来。http协议是以表征状态转移为设计思想设计的其中住的比较高的一层。
        Chauncey_Chen:@叮宕 谢谢分享 :+1: ~

      本文标题:一次HTTP请求的背后

      本文链接:https://www.haomeiwen.com/subject/fsybmttx.html