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

2014-08-19 23:46:02 +08:00
 zichen0422
今天被人问到这个, 然后我突然脑短路, 都不知道自己说的是对是错,望大家普及!

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

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

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

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

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

我上面所说的意思是: 我可以通过建立原始套接字来获取icmp返回的数据包, 然后剥离来解析icmp数据, 分析icmp_code,type等。
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
2014-08-20 14:31:30 +08:00
@billlee 感谢一起讨论!
bombless
2014-08-20 14:35:54 +08:00
@billlee 好的,谢谢您的补充

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

所以澄清一下,Transfer-Encoding: chunked称为长连接。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/128833

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX