zoukankan      html  css  js  c++  java
  • HTTP协议和TCP协议

    HTTP协议

    什么是HTTP

    HTTP协议规定了浏览器怎样向万维网服务请求万维网文档,以及服务器怎样把文档传送给浏览器。在服务器和浏览器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这些格式和规则就是超文本传送协议HTTP。

    HTTP规定在HTTP客户和HTTP服务器之间的每次交互,都由一个ASCII码串构成的请求和一个类似的通用因特网邮件扩充,即“类MIME(MIME-like)”的响应组成。HTTP报文通常都使用TCP连接传送。

    当在地址栏输入www.baidu.com的时候会发生是什么

    1、DNS解析地址

    2、找到相应的服务器

    3、TCP的三次握手建立TCP连接

    4、找到入口文件

    5、解析入口文件

    6、TCP的四次挥手

    7、返回资源页面

    HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP协议本身是无连接的。也就是说,HTTP虽然使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接。

    HTTP协议是无状态的。也就是说,同一个客户第二次访问同一个服务器上的页面的时候,服务器的响应与第一次被访问的时候一样,但是服务器并不知道你曾经访问过这个页面,也不记得你曾经访问过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。

    HTTP报文结构

    HTTP有两类报文:

      请求报文——从客户向服务器发送请求报文

      响应报文——从服务器到客户的回答

    由于HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的。

    HTTP请求报文和响应报文都是由三个部分组成。这两种报文格式的区别就是开始行不同。

      1、开始行,用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行,在响应报文中的开始行叫做状态行。

      2、首部行,用来说明浏览器、服务器或报文主体的一些信息。

      3、实体主体,在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。

     请求报文:

      请求报文的第一行“请求行”只有三个内容:方法、请求资源的URL、HTTP的版本

        请求报文的方法

        

     响应报文:

      响应报文的第一行就是状态行,状态行包括三项内容:HTTP的版本、状态码、解释状态码的简单短语。

      状态码都是三位数字,分为5大类共33种

        1xx 表示通知信息的,如果请求收到了或正在进行处理

        2xx 表示成功,如接受或知道了

        3xx 表示重定向,如要完成请求还必须采取进一步的行动

        4xx 表示客户的差错,如请求中有错误的语法或不能完成

        5xx 表示服务器的差错,如服务器失效无法完成请求

    TCP协议

    TCP的主要特点

    1、TCP是面向连接的传输层协议。也就是说应用程序在使用TCP协议之前,必须先建立TCP连接

    2、每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)

    3、TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达

    4、TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能够返送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。

    5、面向字节流。TCP中的流指的是流入到进程或者从进程流出的字节序列。

    建立一个TCP需要三步

    1:客户端向服务端发出了请求连接请求报文, 首部中的同部位SYN=1,同时选择一个厨师序号seq = x。这时,客户端进入SYN-SENT(同步已发送)状态

    2:服务端收到请求报文后,如果同意建立连接,则向客户端发送确认。在确认报文中SYN和ACK都置1,确认号是 ack = x + 1,自己选择一个初始序号seq = y,服务器进入SYN-RCVD(同步收到)状态

    3:客户端收到服务端确认后,还要想服务端给出确认。确认报文段的ACK置1,确认号2 ack = y + 1,自己的序号 seq = x + 1。这是TCP的连接已建立,客户端进入ESTABLISHED(已建立连接)状态。

    当服务端收到客户端的确认后,也进入ESTABLISHED状态

    为什么客户端还要在发送一次确认呢?

    这是为了防止已失效的链接请求报文突然又传到了服务端。因而产生错误

    “已失效的连接请求报文”是这样产生的:

      客户端发出了第一个连接请求,由于网络等原因导致长时间滞留但是没有丢失,以致延误到连接释放以后的某个时间才到达服务端。按理说这应该是一个早就失效的报文段,但是服务端收到这个失效的报文段后,他不知道你是失效的报文噻,所以就会误以为客户端有发来了一个请求,于是就向客户端发出了确认报文同意连接。假设我们没有第三次的握手,那岂不是又建立了一个连接。

    但是我客户端并没有发出建立连接的请求啊,所以我就不搭理服务器,不给你发送数据。但是服务器以为新的连接已经建立好了,等着你客户端发来数据他就一直等啊等啊等啊,确怎么也等不到。这样就会导致服务器的许多资源就这么浪费了。

    参用了三次握手的办法可以防止上述现象的发生,就如刚才的情况,服务器收不到客户端的确认就知道客户端没有要求建立连接。

    我理解的区别

    TCP是传输层协议,定义数据传输和连接方式的规范。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

    HTTP 超文本传送协议(Hypertext Transfer Protocol )是应用层协议,定义的是传输数据的内容的规范。

    HTTP协议中的数据是利用TCP协议传输的,特点是客户端发送的每次请求都需要服务器回送响应,它是TCP协议族中的一种,默认使用 TCP 80端口。

    好比网络是路,TCP是跑在路上的车,HTTP是车上的人。每个网站内容不一样,就像车上的每个人有不同的故事一样。

  • 相关阅读:
    快速排序算法
    HDOJ(1005) Number Sequence
    HDOJ(1004) Let the Balloon Rise
    HDOJ(1003) Max Sum
    HDOJ(1002) A + B Problem II
    HDOJ(1001) Sum Problem
    HDOJ(1000) A + B Problem
    DeepFaceLab小白入门(5):训练换脸模型!
    DeepFaceLab小白入门(4):提取人脸图片!
    DeepFaceLab小白入门(3):软件使用!
  • 原文地址:https://www.cnblogs.com/mzsh95/p/10697384.html
Copyright © 2011-2022 走看看