TCP 是面向连接的可靠传输协议。假设链路很可靠,不会丢包,那么可不可以只有两次握手?
1
BBCCBB 2019-07-16 17:51:01 +08:00 1
TCP 为什么是三次握手,而不是两次或四次? - HioHio 的回答 - 知乎
https://www.zhihu.com/question/24853633/answer/573627478 特么百度一下就有的东西,你还发上来 |
2
BBCCBB 2019-07-16 17:51:54 +08:00
双方需要协商初始序列号,肯定需要 ack,所以三次是必要的
|
5
cjpjxjx 2019-07-16 18:07:45 +08:00 via iPhone 2
三次握手:
“喂,你听得到吗?” “我听得到呀,你听得到我吗?” “我能听到你,今天 balabala ……” 两次握手: “喂,你听得到吗?” “我听得到呀” “喂喂,你听得到吗?” “草,我听得到呀!!!!” “你 TM 能不能听到我讲话啊!!喂!” “……” 四次握手: “喂,你听得到吗?” “我听得到呀,你听得到我吗?” “我能听到你,你能听到我吗?” “……不想跟傻逼说话” 作者:匿名用户 链接: https://www.zhihu.com/question/24853633/answer/114872771 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 |
6
CEBBCAT 2019-07-16 18:11:46 +08:00
实践了多少年的东西,不是不让你提问,实在是人总是觉得自己想到了别人没想到的事儿。
积极探索很好啊,但不经思考和验证就发到网络上浪费大家时间就不好了 |
8
BBCCBB 2019-07-16 18:14:08 +08:00
发给对方不代表对方收到了。 所以需要 ack 确认! 5 楼那个答案不可信。。。
|
9
mansurx 2019-07-16 18:20:26 +08:00 1
是时候拿出这张祖传老图了。
关于握手次数,楼主可以看下 QUIC 协议~ |
10
azh7138m 2019-07-16 18:22:32 +08:00 2
S ———- syn ————> C
S < —— syn&ack ———— C S ————- ack —————> C > 假设链路很可靠 ack 啥,直接发就是了,重新发明 UDP ? |
11
goofool 2019-07-16 18:22:34 +08:00
假设不成立
|
12
kljsandjb 2019-07-16 18:27:03 +08:00 via iPhone
为了保证双方的收发能力都没问题
|
13
taogen 2019-07-16 18:35:45 +08:00 via Android
三次握手和可靠数据传输没有任何关系。三次握手是建立连接,可靠数据传输是由传输层和链路层相关算法实现。
|
14
pagxir 2019-07-16 18:37:54 +08:00 via Android
TCP 设计的一个目的就是运行在不可靠链路之上的。。。
|
15
xfriday 2019-07-16 18:47:21 +08:00 2
没有第三次握手,可以伪造源 ip 的
|
17
v2byy OP @taogen 正如上面回答的,握手协商双方的 seq,如果没有 seq 号,链路层收到差错包,将之丢弃,就是通过 seq 来重传的,我觉得还是有关系的。
|
20
OhYee 2019-07-16 19:25:25 +08:00 via Android
假设链路很可靠用 udp 啊
tcp 三次握手和链路可靠不可靠又没啥关系 |
21
zhng920823 2019-07-16 19:27:21 +08:00
@azh7138m #10 S 和 C 方向是不是反了
|
23
CEBBCAT 2019-07-16 20:23:10 +08:00 1
> https://github.com/jawil/blog/issues/14
“已失效的连接请求报文段”的产生在这样一种情况下:client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。” 现在你知道为什么要有第三次握手了吗? |
24
petelin 2019-07-16 20:48:35 +08:00
#15 #23 楼 正解
|
25
azh7138m 2019-07-16 20:56:48 +08:00
@zhng920823 哦,那把 C 换成 M 吧(
其实只是想说明下 A/B,下意识写成了 CS,然后 ZZ 了一下,就。。。 |
27
shuizhengqi 2019-07-17 10:28:01 +08:00
假设链接可靠,为什么还需要握手,直接发不就完了
|