HTTP报文格式、TCP、IP报头,以及连接过程总结

自己总结了一下tcp报头,,ip报头和三次握手四次挥手的过程,以及状态连接图中连接断开的过程,以此记录。

关于TCP、IP报头,以及连接过程总结

TCP报头

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

  1. 首先是源端口号和目标端口号,各占16位,标志的连接的端口号和被连接的端口号,它和IP报头中的源IP以及目的IP一起标识出一条TCP的链接。
  2. 然后是序号seq,这个占32位,增长由1-2^32-1,它由数据字节号增长,增长范围在0~2^32-1,换句话说也就是说对于发送数据的长度计数。
  3. 下来则是确认序号ack,也是占32位,当ACK为1时候有效,它的值一般为seq+1。
  4. 首部长度,占4位,,用来记录TCP的报头长度,它的值可以直接偏移到数据位置。
  5. 后面则是保留了6位,规定不能使用。
  6. URG,占一位,当为1时标志紧急指针有效。
  7. ACK,占一位,当为1时标志ack确认序号有效。
  8. PSH,占一位,当为1时标志紧急传输,也就是说这个包应当不用等待缓冲区放满就可以发送。
  9. RST,占一位,当为1时标志重置连接,用于复位。
  10. SYN,占一位,当为1时标志发起连接请求。
  11. FIN,占一位,当为1时标志发起断开连接的请求。
  12. 窗口大小,占16位,指出接收方的接收窗口的大小,控制流量。
  13. 校验和,占16位,将总TCP报文计算出一个校验值放入其中,用于检验。
  14. 紧急指针,占16位,TCP是面向数据流的协议,但当有时一些应用程序在某些紧急情况下(如在某些连接中进行强制中断),要求在接收方在没有处理完数据之前就能够发送一些紧急数据,这就使得发送方将CODE字段的URG置为1 即紧急指针字段有效,这样可以不必考虑你发送的紧急数据在数据流中的位置,也就是相当于优先级最高,紧急指针指出的是紧急数据在报文段中结束的位置。
  15. 选项,在下面单独说。

TCP报头选项

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

  1. 0:选项结束
  2. 1:空选项,一般用来将报文填充到4字节整数倍
  3. 2:

    • 最大报文段长度选项,通信双方在连接初始化的时候用此选项来协商最大报文段长度MSS。
    • TCP模块一般将MSS设置为(MTU-40)字节(减去TCP报头20字节,减去IP报头20字节),这样携带TCP报文段的IP数据报长度就不会超过MTU,从而避免IP分片。
    • 一般MSS值为1460字节(1500-40)。
  4. 3:

    • 是窗口扩大选项,TCP连接初始化时候双方用该选项来协商接收窗口的扩大因子,在TCP头部中,接收通告窗口大小是用15位来表示的,因此最大为65535字节。但实际TCP模块允许的窗口大小远不止这个数(提高TCP通信吞吐量)。
    • 扩大选项是一个移位数,如果窗口大小为M,移位数为n,那么相当于M*2n字节,也就是M左移n位
  5. 4:确认性选择(Selectibe Acknoewledgment, SACK)选项。TCP通信时,某个报文段丢失则TCP模块会重传被确认的TCP报文段后面所有的后续报文。SACK即是改善这种情况使TCP只发送丢失的报文段,不用发送所有的未确认报文段的技术,在TCP连接初始化时,用该选项来确认是否支持SACK技术
  6. 5:是SACK技术工作时候的选项。该选项告诉发送端本端已经接收并缓存且不连续的数据块,使得发送方检查重发丢失的报文段。
  7. 8:时间戳选项,该选项提供了较准确的计算通信双方之间的回路时间(RTT)的方法,从而为TCP流量控制提供重要信息。

IP报头

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

  1. 版本号,占4位,用来指明IP版本号。
  2. IP头长度,占4位,用来指明IP报头长度值,可以用来偏移到数据位置。
  3. 服务类型,占用8位

    有3bits的优先权字段,现在已经闲置。

    4bitsTOS字段,这四位中只能有一个为1,用来选中选项,分别是最小时延,最大吞吐量,最高可靠性,最小费用。

    1bit弃用。

  4. 总长度,占16位,记录整个报文长度。
  5. 标识,占16位,用来标识数据报序号。
  6. 标志,占3位。

    【2】为1标志这是最后一个分段。

    【1】为1标志这个数据报可分段。

    【0】保留,统一置零。

  7. 片偏移,占13位,,标志这段数据在原本数据中所处的位置。
  8. 生存时间,TTL,占8位,由DNS查询到所访问的目标服务器这个过程来计时,然后保存在DNS缓存中,当DNS缓存过期时再重复这个过程。与其说它是个时间,不如说它更像一个跳数,每经过一个路由,规定路由对于这个字段的值至少减1,当它为零时候这个数据报会被抛弃,以用来处理永远抵达不了的数据。
  9. 协议,占8位,用来指明处理后由哪个上层协议来接收,例如TCP。
  10. 头部校验和,占16位,确保IP报头信息。
  11. 源IP,占用32位,标记发送方的IP地址。
  12. 目的IP,占用32位,标记目标方的IP地址。
  13. 选项,可选,最多40位,会用0填充以保证是32的倍数。

三次握手

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

第一二次连接时候不能加数据,也必须消耗序号。

在第三次握手时候,可以加入数据,那么会消耗序号,但是如果不携带数据的话是不消耗数据的,下次发送时候seq = x + 1。

四次挥手

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

四次挥手这个过程也是可以在三次完成的,也就是将二三合一,服务器同时将ACK和FIN返回给客户端,那么就可以简洁到三次挥手。

状态转移图断开

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

加入一个HTTP的报文格式,emmmmm,好像违背了开闭原则哈,连题目都改了。。。。。

HTTP请求报文格式:

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

  1. 请求方法

    GET:请求获取Request——URL所标识的资源

    POST:在Request——URL所标识的资源后附加资源

    HEAD:请求获取由Request——URL所标识的资源的响应消息报头

    PUT:请求服务器存储一个资源,由Request——URL作为其标识

    DELETE:请求服务器删除由Request——URL所标识的资源

    TRACE:请求服务器回送收到的请求信息(用于测试和诊断)

    CONNECT:保留

    OPTIONS:请求查询服务器性能

  2. URL
    URI全名为Uniform Resource Indentifier(统一资源标识),用来唯一的标识一个资源,是一个通用的概念,URI由两个主要的子集URL和URN组成。URL全名为Uniform Resource Locator(统一资源定位),通过描述资源的位置来标识资源。URN全名为Uniform Resource Name(统一资源命名),通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化。
  3. 协议版本
    格式为 HTTP/主版本号.次版本号,常用为:HTTP/1.1 HTTP/1.0
  4. 请求头部

    Host:接受请求的服务器地址,可以是IP或者是域名

    User-Agent:发送请求的应用名称

    Connection:指定与连接相关的属性,例如(Keep_Alive,长连接)

    Accept-Charset:通知服务器端可以发送的编码格式

    Accept-Encoding:通知服务器端可以发送的数据压缩格式

    Accept-Language:通知服务器端可以发送的语言

HTTP响应报文:

《HTTP报文格式、TCP、IP报头,以及连接过程总结》

    1. 协议版本,同请求报文
    2. 状态码,100~199表示请求已收到继续处理,200~299表示成功,300~399表示资源重定向,400~499表示客户端请求出错,500~599表示服务器端出错

      200:响应成功

      302:跳转,重定向

      400:客户端有语法错误

      403:服务器拒绝提供服务

      404:请求资源不存在

      500:服务器内部错误

    1. 响应头部

      Server:服务器应用软件的名称和版本

      Content-Type:响应正文的类型

      Content-Length:响应正文的长度

      Content-Charset:响应正文所使用的编码

      Content-Encoding:响应正文使用的数据压缩格式

      Content-Language:响应正文使用的语言

        原文作者:TCP
        原文地址: https://segmentfault.com/a/1190000013817312
        本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
    点赞