美文网首页
http请求流程

http请求流程

作者: 阿d老师 | 来源:发表于2020-07-21 13:59 被阅读0次

    1.简介

    超文本传输协议

        HTTP是一个基于TCP协议来传递数据(HTML 文件, 图片文件, 查询结果等

    tcp协议就是从一台主机一个字节一个字节有序地传输到另一台主机。

    对于HTTP协议来说,自然保持了这种有序性,即按照首行、头部、正文的顺序进行传输

    2.主要特点

        简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

        灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

        无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

        无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    3.HTTP请求

        首行:包括请求方式Method、资源路径URL、协议版本Version;

        头部:包括一些访问的域名、用户代理、Cookie等信息;

        正文:就是HTTP请求的数据。

    4.HTTP响应

        首行:包括协议版本Version、状态码Status Code、回应短语;

        头部:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;

        正文:就是响应的具体数据。

        头部用来指出HTTP消息的一些属性,它们有固定的格式

        请求头参数

            Content-Type 规定正文的格式

            Accept 指定客户端能够接收的内容类型

            Accept-Language

            Accept-Charset

            Date

            Cache-Control 请求和响应遵循的缓存机制

            Host 请求的服务器的域名和端口号

        响应头参数

            200---OK/请求已经正常处理完毕

            301---/请求永久重定向

            302---/请求临时重定向

            304---/请求被重定向到客户端本地缓存

            400---/客户端请求存在语法错误

            401---/客户端请求没有经过授权

            403---/客户端的请求被服务器拒绝,一般为客户端没有访问权限

            404---/客户端请求的URL在服务端不存在

            500---/服务端永久错误

            503---/服务端发生临时错误

        http传输

        HTTP协议被人总结为无连接、无状态的特点:

            无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

        无状态: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

        另一方面,在服务器不需要先前信息时它的应答就较快。

        物理层(01010101)-(mac头部+数据)》数据链路层(llc头部+数据)-》网络层-(ip头部+数据)》

    传输层(tcp头部+数据)-》会话层(高层数据)-》表示层-》应用层

    位-》帧-》包-》段-》数据

        设备之间传输-》组装帧,使用mac地址访问介质-》根据逻辑地址为数据包选路-》提供应用进程之间的端到端的链接,流量控制-》报错不同应用进程的数据独立性-》如何表示数据,特殊处理(加密)-》用户接口

    网络层

        IP协议

            规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。

            广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数"子网掩码"(subnet mask)。

            通过"子网掩码"就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行运算

            IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

        IP数据包

            根据IP协议发送的数据,就叫做IP数据包。其中必定包括请求方和发送方的IP地址信息。

    传输层

        有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

        接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

        也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口"(port),

        它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

        "传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,

        我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

    UDP协议

        现在,我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号。

     TCP协议

        UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,

        每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

    从用户角度出发

    用户上网设置

      1.1 静态IP地址

             本机的IP地址

        子网掩码

        网关的IP地址

        DNS的IP地址

      1.2 动态IP地址

          所谓"动态IP地址",指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议。

          这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做"DHCP服务器"。

          新的计算机加入网络,必须向"DHCP服务器"发送一个"DHCP请求"数据包,申请IP地址和相关的网络参数。

      前面说过,如果两台计算机在同一个子网络,必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?

      DHCP协议会协助新的计算机获取这些地址

    二、实例流程

      1.1 本机参数

           本机的IP地址:192.168.1.100

      子网掩码:255.255.255.0

      网关的IP地址:192.168.1.1

      DNS的IP地址:8.8.8.8

      浏览器输入www.google.com,意味着,浏览器要向Google发送一个网页请求的数据包

      1.2 DNS协议

          我们知道,发送数据包,必须要知道对方的IP地址。但是,现在,我们只知道网址www.google.com,不知道它的IP地址。

          DNS协议可以帮助我们,将这个网址转换成IP地址。已知DNS服务器为8.8.8.8,于是我们向这个地址发送一个DNS数据包(53端口),然后,DNS服务器做出响应,告诉我们Google的IP地址是172.194.72.105。于是,我们知道了对方的IP地址。

      1.3 子网掩码

          接下来,我们要判断,这个IP地址是不是在同一个子网络,这就要用到子网掩码。

          已知子网掩码是255.255.255.0,本机用它对自己的IP地址192.168.1.100,做一个二进制的AND运算计算结果为192.168.1.0;然后对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0。这两个结果不相等,所以结论是,Google与本机不在同一个子网络。

          因此,我们要向Google发送数据包,必须通过网关192.168.1.1转发,也就是说,接收方的MAC地址将是网关的MAC地址。

      1.4 应用层协议

          浏览网页用的是HTTP协议,将http内容嵌入TCP数据包中

      1.5 TCP协议

          TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

      1.6 IP协议

          然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。

      1.7 以太网协议

          最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。

      1.8 服务器端响应

          经过多个网关的转发,Google的服务器172.194.72.105,收到了以太网数据包。

          根据IP标头的序号,Google取出完整的TCP数据包,然后读出里面的"HTTP请求",接着做出"HTTP响应",再用TCP协议发回来。本机收到HTTP响应以后,就可以将网页显示出来,完成一次网络通信。

    -----

    http请求的详细过程

        HTTP是一个应用层的协议,在这个层的协议,是一种网络交互需要遵守的一种协议规范。

            1、连接:当输入一个请求时,首先建立一个socket连接,因为socket是通过ip和端口建立的,所以,之前则还有一个DNS解析过程。如把www.baidu.com变成一个ip,如果url不包含端口号,则会使用该协议的默认端口号,HTTP协议的默认端口号为80。

            2、请求:连接成功后,开始向web服务器发送请求,这个请求一般是GET或POST请求。

            3、应答:web服务器收到这个请求,进行处理。web服务器会把文件内容传送给响应的web浏览器。 包括:HTTP头信息,体信息。

            4、关闭连接:当应答结束后,web浏览器与web服务器必须断开,以保证其它web浏览器能够与web服务器建立连接。Socket:是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层。

            http是个应用层的协议,它实际上也建立在TCP协议之上。(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。)

            Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。

    TCP

        TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。

        TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

        TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

    三次握手

        第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

        第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

        第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

        握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

        理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

        断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客 户端交互,最终确定断开)

        注意:三次握手是为了建立稳定可靠的链接,然后进行正式的数据传输,当数据传输完成之后,在通过四次挥手断开链接

    利用Socket建立网络连接的步骤

        建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

        套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

    1.服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,

    实时监控网络状态,等待客户端的连接请求。

    2.客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

    3.连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描 述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。

    而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

    相关文章

      网友评论

          本文标题:http请求流程

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