美文网首页资源web开发内功修炼
懵逼的HTTP、Socket与TCP

懵逼的HTTP、Socket与TCP

作者: YungFan | 来源:发表于2016-07-06 09:13 被阅读9621次

    HTTP、Socket、TCP这三个概念在网络开发中经常被提及,也是比较容易被混淆的概念,这三者在TCP/IP协议族中的位置关系:

    三者的位置关系.png

    其中,HTTP是应用层的协议,也是开发中最常用的一个网络协议;TCP是传输层的协议,大学学过计算机网络的都知道,该层还有一个UDP协议;而Socket是从传输层上抽象出来的,采用IP地址加端口号的形式来标识,并不是传统意义上的网络协议,所以从协议簇来说,三者还是很好区分的。那么HTTP连接、TCP连接、Socket连接有什么区别?

    1、TCP连接与HTTP连接

    在网络分层中,HTTP协议是基于TCP协议的,客户端向服务端发送一个HTTP请求时,需要先与服务端建立TCP连接,也就是经典的三次握手(通常对用户来说是很难察觉的),握手成功以后才能进行数据交互。HTTP是基于请求响应模式且无状态的协议,1.1之前只支持短连接,也就是请求响应一次以后连接中断,下次请求需要重新进行TCP连接,而1.1之后支持持长连接,即进行一次TCP连接以后,客户端可以发送多次的HTTP请求给服务器端。

    小结:HTTP基于TCP

    2、TCP连接与Socket连接

    Socket是应用层与传输层之间的同一个抽象层,它是一套接口,所以Socket连接可以基于TCP连接,也有可能基于UDP。我们知道,TCP协议是可靠的,UDP协议是不可靠的,那么基于TCP协议的Socket连接同样是可靠的;基于UDP协议的Socket连接是不可靠的,大多数的即时通讯工具都是基于后者实现的。

    小结:Socket可基于TCP,亦可UDP

    3、HTTP连接与Socket连接

    HTTP 1.1之前是短连接,基于TCP协议的Socket连接是长连接,虽然HTTP1.1开始支持长连接,但不像Socket连接一旦建立,除非一方主动断开,否则连接状态一直保持。(网友ttdevs向我补充:基于TCP的Socket可能是短连接,也可能是长连接,长连接可能需要通过心跳等一些手段来维持,各自有不同的应用场景。而不是简单的"基于TCP协议的Socket连接是长连接"。后在网上查找了相关资料,有这么一句:"在TCP连接保持期间,如果没有数据包发送,定时发送数据包(心跳),以维持连接状态。"因为我自己没做过这块的具体工作,如果有大神可以详解,欢迎指正! )

    HTTP连接中,只有客户端发起请求后服务端才会响应,服务端是无法主动向客户端发消息的。而Socket连接中,通信双方发送消息并没有先后的限制,通信双方中的任何一方可以随时向另一方发送消息。

    4、HTTP Or Socket?

    用HTTP:双方不需要时刻保持连接,客户端只是通过一个个HTTP请求来获取服务器的特定资源。如通过get/post请求获取网页、图片、JSON或者XML数据,还有常用的文件上传、小文件下载等。

    用Socket:大部分即时通讯应用(知乎上说QQ有部分功能是基于TCP,因为TCP每次都需要三次握手,虽然可靠但是网络不好的时候就惨了)、聊天室(基于UDP+消息广播的方式)、大文件传输等。

    相关文章

      网友评论

      • 01010100:你好,想请教一下TCP连接与HTTP请求的关系。
        在其他地方看到有比喻:一个TCP连接是一条高速公路,一个HTTP请求就是其中一条车道的一次运输过程。不知道这个比喻是否正确?
        其实,也就是想问:一个TCP连接是否同时可以存在多个请求(即多个车道的概念)?
        YungFan:@沉淀_0x0 不会
        01010100:@YungFan 其实我想问的就是,一个TCP连接是否只对应一个请求,还是说一个连接里可以同时存在多个请求?如果存在多个请求,一个请求结束,而这个连接还存在其他请求,那应该是不能直接释放的吧。
        YungFan:@沉淀_0x0 我的理解是:首先HTTP基于TCP,但是TCP只是负责连接,不涉及请求和数据传输,而HTTP是应用层的协议,用于请求和收发数据。一个HTTP完成的过程肯定包含TCP连接,但一次请求结束以后就释放连接了。
      • 我的阿福:其实我有一点不明,既然http1.1后可以维持长链接,但是又只能客户端主动请求,那么长链接意义何在?然后为什么sockt就可以双向主动通信而http又不行呢
        YungFan:@我的阿福 对 客户端可以一次发多个请求 有个属性Keep-Alive可以设置时间 如果超过这个时间才断开
        我的阿福:@YungFan 说的有道理,但是你说的第二点,在http 1.1以后,客户端请求完成以后,应该是没断开?
        YungFan:@我的阿福 我理解的是1.可以避免每次连接都要进行握手操作 2.socket设计的时候就是双向通信的,也是需要客户端连接上去后才可以,http设计的是请求响应无状态的协议,连接上去以后,客户端请求服务器响应后这次就结束了,断开了。
      • 零一间:TCP 是传输控制协议,面向连接,传输数据流。是TCP/IP协议的传输层协议。

        socket本质是(API),对TCP/IP的封装,可供程序员做网络通讯开发是所调用。

        http 是基于TCP面向互联网的请求响应模型的一种协议。
        YungFan:@战神悟空 :+1:
      • llyofdream:谢谢分享
        YungFan:@llyofdream :blush::blush:
      • 64e52ae86954::smile: 我专业唉 在这里看到感觉好亲切
        64e52ae86954:@YungFan 嗯嗯
        YungFan:@一小只yixiaozhi 学计算机的?
      • 苦笑男神:学习了
        YungFan:@日月神话的爱 :grin::grin::grin:
      • 24e12c9419ea:厚底鞋继续保持吃
        YungFan:@24e12c9419ea :disappointed_relieved: 你是为了完成简书任务获取积分吗?
        24e12c9419ea:@YungFan 对不起 我瞎按的
        YungFan:@24e12c9419ea ?
      • ttdevs:“HTTP是短连接,Socket(基于TCP协议的)是长连接” ?这个说法欠妥吧。
        YungFan:@ttdevs 需要维持吗?写Java的Socket的时候,除非一方close掉,否则一直连接的,底层源代码没看过,小弟才疏学浅,可能认识有不足。
        ttdevs:@YungFan 个人理解:Socket可以基于TCP/UDP。UDP是无连接的,基于TCP的Socket可能是短连接,也可能是长连接,长连接可能需要通过心跳等一些手段来维持,各自有不同的应用场景。而不是简单的“Socket(基于TCP协议的)是长连接”。
        YungFan:@ttdevs 已修改成1.1之前
      • 星际之痕:IM基于后者指的是UDP吗?作者不会是笔误吧?
        巷子里的童年Cc:@星际之痕 类似于QQ这种的确实是UDP传输,链接稳定时会采用UDP形式互送消息,链接不稳定时,会在腾讯服务器上讲你们消息做一个中转!
      • 古斯比德:还是总结的蛮好理解的,先mark了
      • 关hust:Http短连接单向get,socket长连接双向控制
      • 七寸知架构:第四部分 请再考究下 http socket的场景选择 上面的内容,描述了表象,但没有究其本质
        YungFan:@陶邦仁 说得好,HTTP基于“请求/响应” 且无状态,其实就能看出来是基于TCP的,视频传输这种量比较大的都是基于UDP,最新的苹果APNS是基于 HTTP/2
        七寸知架构:@YungFan HTTP只是一个应用协议规范,其特点就是无状态、短连接,相对于socket来说,client只在需要的时候,才会建立连接,响应结束后,断开连接。这样以保证最大限度的连接资源释放和重用,适用的场景:浏览器、RPC服务、API网关等场景,减少一直独占连接资源。而socket可以理解为就是TCP、UDP,它是在任何涉及通信的场景,都会用到的传输层协议。
        YungFan:@陶邦仁 欢迎补充 :grin:
      • 巷子里的童年Cc:转的别人的要转全吧?是不是应该标明个出处?
        巷子里的童年Cc:@陶邦仁 对,你说的很对,我们也不知道谁是原创,刚刚好,昨天刚看了一篇一模一样的,只不过内容更全,理解深一点,说一下,这篇连总结都和人一模一样,不过换了图而已!没别的意思,见到了说一下而已,不爱听的我可以删回评论!
        七寸知架构:@巷子里的童年Cc 知识是共享、分享的,只要对读者您带来收获,何必挣个是原创还是转载呢?其实毫无利益关系,谁能知道其他人的原创就是真的原创。以上拙见。
        YungFan:@巷子里的童年Cc 这些知识网上很多啊 整理一下而已
      • d986a99f7325:IM是用TCP来做的吧?怎么是基于后者呢?
        YungFan:@林加威_Jarvis 上过网络的都知道TCP与UDP的差别吧 你去查查其他的资料吧 Google一下
        d986a99f7325::flushed:UDP是不可靠的协议,会丢数据包的,你确定吗?你查过没有?
        YungFan:@林加威_Jarvis 并不是
      • e648068d31d8:最后一句总结让人欢喜
      • 猴小贱:简练,不啰嗦。
        YungFan:@猴小贱 :grin::grin:
      • 小九九留:我还小,不要骗我。。
        YungFan:@渔舟唱晚馨 大学计算机网络里面都有这个课程吧
        小九九留:@YungFan 我老师没教阿。。。要不你教教我?
        YungFan:@渔舟唱晚馨 :joy::joy::joy:
      • 凯文Kevin21:socket不一定是基于tcp的吧。
        YungFan:@周俊佐 文中其实说明了 很多人估计只看了小结 标注一下
        nlpjoe:@YungFan 作者已经更正了哈,很好的文章
        YungFan:@七秒小鱼人 可基于 你看清楚 文中说的很清楚 也可能基于UDP
      • nlpjoe:socket基于TCP的结论是怎么得出来的?
        nlpjoe:@陶邦仁 作者已经更正了哈
        七寸知架构:@周俊佐 TCP、UDP是两种不同的通信机制,Socket只是对两者做了API封装
        YungFan:@周俊佐 是可以基于TCP,也可以基于UDP

      本文标题:懵逼的HTTP、Socket与TCP

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