V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zichen0422
V2EX  ›  Linux

HTTP 长连接 跟 短连接, 还有 ICMP 这个协议, 大家没事讨论讨论呗?

  •  
  •   zichen0422 · 2014-08-19 23:46:02 +08:00 · 3959 次点击
    这是一个创建于 3750 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天被人问到这个, 然后我突然脑短路, 都不知道自己说的是对是错,望大家普及!

    首先说下我当时说的:
    1,http 长连接 需要在header加Keep-alive, 但是有点不安全, (这个时候突然脑抽的说了句 会话保持,不知道能不能扯上关系)。
    2,http 短连接 就是发送接收完数据后就关闭, 缺点是要每次都需要重新连接,

    ICMP 协议
    当时说的是:
    1,网际控制协议。有个TTL值最大128.
    2,ping 根据路由表查询目的地址是否可达,
    3, 是用ip数据包封起来的, 用原始套接字,可以把获取到的icmp信息, 剥离ip数据包头之后,根据icmp的包头格式进行解析。

    以上是我当时说出来的东西,然后就没有然后了。
    希望大家多多指正我说的,小弟在此感谢了。
    22 条回复    2014-08-20 20:33:37 +08:00
    est
        1
    est  
       2014-08-20 00:03:28 +08:00 via Android   ❤️ 1
    差不多没错。ttl搞到256应该没问题
    billlee
        2
    billlee  
       2014-08-20 00:07:30 +08:00   ❤️ 1
    ping 可不是查路由表,是向目标发送一个 ICMP type=8 消息,目标收到后回复一个 ICMP type=0 的回复。
    ICMP 是 Internet 控制消息协议,用来传输关于网络层上的各种问题的消息,想什么 target unreachable 啊,路由建议什么。
    TTL 是 IP 里面的,表示这个 IP 包还能转发多少个 hop. 用来防止环路导致的 flood.
    66450146
        3
    66450146  
       2014-08-20 00:22:35 +08:00 via Android
    IP 和 ICMP 从某种意义上来说是鸡和蛋的关系。。。
    wsph123
        4
    wsph123  
       2014-08-20 00:35:05 +08:00
    http 长连接 不安全应该还是谈不上吧?
    XDA
        5
    XDA  
       2014-08-20 07:55:25 +08:00 via Android
    这种东西不是应该去翻书么,<HTTP权威指南><TCP/IP详解>
    zichen0422
        6
    zichen0422  
    OP
       2014-08-20 08:44:59 +08:00
    @XDA 一个场景就是我当时突然被问到,来不及翻书. 所以根据记忆去说的。
    zichen0422
        7
    zichen0422  
    OP
       2014-08-20 08:46:30 +08:00
    @wsph123 我也说不清到底安全不安全, 我只是模糊记得长连接有点不安全.
    zichen0422
        8
    zichen0422  
    OP
       2014-08-20 08:50:30 +08:00
    @billlee 你的说法比我的好理解多了,

    如果ping的目的地址不可达的话,这个时候要返回unreachable给源地址, 不是根据路由器转发, 去查询路由表吗?
    julyclyde
        9
    julyclyde  
       2014-08-20 10:35:01 +08:00
    @zichen0422 谁查不到路由表,谁就负责产生unreachable。一般计算机都有默认网关,所以不会给自己产生这个消息的
    msg7086
        10
    msg7086  
       2014-08-20 11:30:28 +08:00
    keep-alive是持久连接,不是长连接。保持会话用的是cookie,和连接也没关系,单次连接中的多个请求本身是会话无关的。甚至有可能单个持久连接中的请求来自不同的人和不同的机器。(比如持久连接的http代理)
    bombless
        11
    bombless  
       2014-08-20 11:55:47 +08:00
    纠正一个错误。
    1.0默认是短连接,1.1默认是长连接也就是说Connection头并不是非加不可。
    长连接的好处是降低三次握手开销,也就是多个请求能重用一个tcp连接,但是要注意的是维持tcp连接也带来开销。
    这里面没有什么安全隐患。
    bombless
        12
    bombless  
       2014-08-20 11:58:15 +08:00
    还有就是ICMP并不是IP封起来的另外它当然也有TTL。它跟IP是同一层的。
    zichen0422
        13
    zichen0422  
    OP
       2014-08-20 13:56:22 +08:00
    @msg7086
    keep-alive是持久连接, 不是长连接, 那怎么理解长连接, http有属性标记吗?
    今天查了部分资料 长连接有 @bombless 所说多个请求用一个tcp连接降低三次握手.

    但是不能仅仅从http 1.0/1.1来区别是长连接吧?
    我的意思是指: 比如发起的http请求, server能识别是长连接, 靠什么识别是长连接?
    zichen0422
        14
    zichen0422  
    OP
       2014-08-20 13:59:30 +08:00
    @bombless 额, 明白, 谢谢指点, icmp处于网络层(今天才知道,哭死)。

    我上面所说的意思是: 我可以通过建立原始套接字来获取icmp返回的数据包, 然后剥离来解析icmp数据, 分析icmp_code,type等。
    billlee
        15
    billlee  
       2014-08-20 14:22:04 +08:00
    @bombless @zichen0422 根据 RFC 792, ICMP 包有和 IP 包一样的头部,并且 "uses the basic support of IP as if it were a higher level protocol".
    把 ICMP 包理解为是 IP 包封起来的完全没有问题。只是在协议中,ICMP 是 IP 的一个部分。
    zichen0422
        16
    zichen0422  
    OP
       2014-08-20 14:31:30 +08:00
    @billlee 感谢一起讨论!
    bombless
        17
    bombless  
       2014-08-20 14:35:54 +08:00
    @billlee 好的,谢谢您的补充

    另外针对13楼我说一下,我的意思是1.1可以是持久连接也可以不是,加个Connection: Close
    的话对方就会认为不是持久连接,否则的话默认是持久连接。
    bombless
        18
    bombless  
       2014-08-20 14:43:10 +08:00
    对了还有一个问题是Transit-Encoding: Chunked也会带来长连接,这个时候Content-Length会被忽略,因为对方不能确定数据有多长,这时候也是持久连接(有些人觉得这种才叫长连接)。
    不过细节我忘了,现在手机不方便查。
    bombless
        19
    bombless  
       2014-08-20 14:47:25 +08:00
    搜chunked encoding内容还挺多的,包括维基以及几篇中文博客。
    头部的名称应该是Transfer-Encoding我打错了。
    bombless
        20
    bombless  
       2014-08-20 14:57:55 +08:00
    啊,我18楼的说法是错误的,我只是想起长连接的内容却把它和持久连接化为一谈…
    以及更早的11层的内容我应该改叫持久连接。

    所以澄清一下,Transfer-Encoding: chunked称为长连接。
    msg7086
        21
    msg7086  
       2014-08-20 19:29:34 +08:00
    @bombless 没错。

    持久连接是一次TCP会话处理多个请求和回复,是用来减少握手次数的技术。

    长连接是发起一个请求以后,服务器端在很长的时间内逐步多次返回数据,由浏览器分多次显示或者执行的技术。一般是请求一个javascript,逐步返回各种函数,并由浏览器分多次执行。方式就像楼上说的,用chunked返回不定长的body。

    ---

    @zichen0422 顺便at你。
    zichen0422
        22
    zichen0422  
    OP
       2014-08-20 20:33:37 +08:00
    @bombless @msg7086 谢谢,谢谢指导, 让我明白多了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2633 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:38 · PVG 23:38 · LAX 07:38 · JFK 10:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.