今天看啥  ›  专栏  ›  晨萧辰

TCP/IP协议以及HTTP解读

晨萧辰  · 掘金  ·  · 2019-07-03 06:58
阅读 66

TCP/IP协议以及HTTP解读

对TCP/IP以及HTTP的知识实在太混乱,有些方面存在盲点,故整理了相关知识点。


TCP/IP协议

TCP/IP协议模型:

对端传输:


TCP三次握手四次挥手


注:SYN: 同步序列号;Seq:发送序号;ACK:确认字符

三次握手过程:

一握手 : 客户端向服务端发送请求报文段,SYN为1,Seq 为X,随后进入SYN_SEND

二握手 : 服务的接收请求报文,发送ACK:x+1,SYN:1,Seq : Y。随后进入SYN_RECV

三握手 : 向服务器发送Seq+ACK报文,发送完毕后客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

为什么需要第三次握手?

第三次握手在理论上是可以完全省略的,在第二次握手服务器询问客户端是否准备好时就应该建立连接。那为什么要存在第三次握手呢?

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。产生原因主要是因为客户端第一次握手请求在某种情况下延误到连接释放后才到达服务段,如果只使用两次握手这时连接已经建立,但这个连接永远不会使用,也不会释放,server的很多资源就白白浪费掉了。


第一次挥手: 主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次挥手 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

第三次挥手 主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次挥手 主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

为什么要四次挥手?

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

简单的 HTTP 协议


请求行

请求行(Request line)分为三个部分:请求方法请求地址协议版本

请求头

  • Cache-Control
    • no-cache 指客户端不缓存过期资源
    • no-store 指不进行缓存
    • max-age 指缓存资源的缓存时间比指定的值小,那么客户端就接受缓存资源,且缓存服务器不对资源有效性进行再次确认
  • Connection 指控制不再转发给代理的首部字段(Hop-by-hop),管理持久连接
    • close 指服务器像明确断开连接
    • Keep-Alive 指保存持久连接,HTTP/1.1前默认连接是非持久性的,如需要保存持久连接,需要增加此字段
  • Upgrade 可以用来指定一个完全不同的通信协议,对于这个字段,服务器可以返回101状态码

  • 请求体


    Post 和 Get 的区别

    先引入副作用和幂等的概念。

    副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。

    幂等指发送 M 和 N 次请求(两者不相同且都大于1),服务器上资源的状态一致。注册10个和11个帐号是不幂等的,对文章进行更改10次和11次是幂等的。

    在规范的应用场景上说,Get 多用于无副作用,幂等的场景,例如搜索关键字。Post 多用于副作用,不幂等的场景,例如注册。

    在技术上说:

    • Get 请求能缓存,Post 不能
    • Post 相对 Get 安全一点点,因为Get 请求都包含在 URL 里,且会被浏览器保存历史纪录,Post 不会,但是在抓包的情况下都是一样的。
    • Post 可以通过 request body来传输比 Get 更多的数据,Get 没有这个技术
    • URL有长度限制,会影响 Get 请求,但是这个长度限制是浏览器规定的,不是 RFC 规定的
    • Post 支持更多的编码类型且不对数据类型限制



    参考文档

    juejin.im/post/587230…

    juejin.im/post/598ba1…





    原文地址:访问原文地址
    快照地址: 访问文章快照