zoukankan      html  css  js  c++  java
  • HTTP交互

    Http协议:

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。(以上来自百度百科)

    一:TCP/IP协议
    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。

    HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集。属于应用层。

    1:TCP报文结构

    TCP协议是封装在IP数据包里的:

    下图是TCP报文的数据格式。TCP首部如果不计选项和填充字段,它通常是20个字节。

    字段介绍:

    • 源端口和目的端口:

    各占2个字节,这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。有时一个IP地址和一个端口号也称为socket(插口)。

    • 序号(seq):

    占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400;序号是32bit的无符号数,序号到达2^32-1后从0开始。

    • 确认序号(ack):

    占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;确认序号应该是上次已成功收到数据字节序号+1。

    只有ACK标志为1时,确认序号才有效。

    • 数据偏移:

    占4比特,表示数据开始的地方离TCP段的起始处有多远。实际上就是TCP段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。数据偏移以32位为长度单位,也就是4个字节,因此TCP首部的最大长度是60个字节。即偏移最大为15个长度单位=1532位=154字节。

    • 保留:

    6比特,供以后应用,现在置为0。

    • 6个标志位比特:

    ① URG:当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长。

    ② ACK:只有当ACK=1时,确认序号字段才有效;

    ③ PSH:当PSH=1时,接收方应该尽快将本报文段立即传送给其应用层。

    ④ RST:当RST=1时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接;

    ⑤ SYN:SYN=1,ACK=0时表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;

    ⑥ FIN:发端完成发送任务。

    2:TCP三次握手和四次挥手 : 握手代表连接,挥手代表拜拜。

    三次握手

    客户端向服务器发请求,服务器接收请求,服务器接收请求之后发送一个连接标志,客户端接收连接标志之后也向服务器发送一个连接标志,至此连接完成。

    三次握手的作用是确定客户端和服务端都同时具备接受和发送的能力

    客户端  ====> 服务器  // 主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;。(第一次请求服务器确定了客户端有发送能力。) 
    客户端 <==== 服务器 // 主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包。(第二次请求客户端确定了服务器有接收和发送请求的能力。)
    客户端 ====> 服务器 // 主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。(第三次请求服务器确定了客户端拥有接收请求的能力)通过以上三次握手,双方确定对方同时拥有接受和发送的能力。  
    

    四次挥手

    为什么有4次挥手呢,4次挥手的作用就是断开连接,之所以要断开连接是因为TCP/IP协议是要占用端口的,而计算机的端口是有限的,所以一次传输完成之后是要断开连接的,断开连接的方式就是4次挥手。

    那为什么连接是3次,而断开要4次呢?是因为TCP连接是全双工的,因此每个方向都必须单独进行关闭。

    客户端  ====> 服务器 // TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
    客户端  <==== 服务器 // 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
    客户端  ====> 服务器 // 服务器关闭客户端的连接,发送一个FIN给客户端。
    客户端  <==== 服务器 // 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
    
    前两次挥手关闭客户端到服务器的数据传送,后两次挥手关闭服务器到客户端的数据传送
    

    二:HTTP报文

    http报文结构为:

    起始行:对报文进行描述
    
    头部:向报文中添加了一些附加信息,是一个名/只的列表,头部和协议配合工作,共同决定了客户端和服务器能做什么事情
    

    例如:Content-Length(主体长度),Content-Type(主体类型)等。

    主体:包含数据的主体部分
    
    http协议是一个应用层协议,其报文分为请求报文和响应报文。
    
    当客户端请求一个网页时,会先通过http协议将请求的内容封装在http请求报文之中,服务器收到该请求报文后根据协议规范进行报文解析,然后向客户端返回响应报文。
    


    上图是一个网络请求中的请求报头和响应报头

    三:状态码
    在http协议中,状态码被分为了5大类

    • 100~199(信息性状态码)
    • 200~299(成功状态码)
    • 300~399(重定向状态码)
    • 400~499(客户端错误状态码)
    • 500~599(服务器端错误状态码)

    常见状态码:

    100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
    
    101: 转换协议 在发送完这个响应最后的空行后,将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
    
    102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
    
    200:请求成功 处理方式:获得响应的内容,进行处理
    
    201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
    
    202:请求被接受,但处理尚未完成 处理方式:阻塞等待
    
    204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户,则无须为此更新自身的文档视图。 处理方式:丢弃
    
    300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃 
    301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
    
    302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
    
    304:请求的资源未更新
    
    400:非法请求
    
    401:未授权 处理方式:丢弃
    
    403:禁止 处理方式:丢弃
    
    404:没有找到 处理方式:丢弃
    
    500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在的源代码出现错误时出现。
    
    501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
    
    502:错误网关 作为网关或者工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
    
    503:服务出错 由于临时的维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
    

    四:请求方法

    HTTP 定义了与服务器交互的不同方法,一个URL地址,它用于描述一个网络上的资源,而 HTTP 中的GET,POST等方法就是对这个资源的操作。常见的请求方法有:

    • OPTIONS:

    返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性

    • HEAD:

    向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。

    • GET:

    向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。

    • POST:

    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form

    • PUT:

    向指定资源位置上传其最新内容

    • DELETE:

    请求服务器删除Request-URL所标识的资源

    • TRACE:

    回显服务器收到的请求,主要用于测试或诊断

    • CONNECT:

    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

  • 相关阅读:
    电脑设置开机
    python 环境搭建 python-3.4.4
    遍历hashmap 的四种方法
    Java8 使用 stream().map()提取List对象的某一列值及排重
    解决 SpringMVC 非spring管理的工具类使用@Autowired注解注入DAO为null的问题
    CXF之"@XmlType.name 和 @XmlType.namespace 为类分配不同的名称"错误
    java.lang.NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL
    java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern
    java.lang.IllegalArgumentException: Request header is too large
    ie8 报错:意外地调用了方法或属性访问
  • 原文地址:https://www.cnblogs.com/zhengyufeng/p/11099220.html
Copyright © 2011-2022 走看看