关于 TCP/IP 的一个问题

2016-12-20 09:12:36 +08:00
 pumpkin

在看 TCP/IP 协议卷的时候, TCP 服务连接后,断开之前如果不考虑报文丢失之类的话,服务端一直都是在确认客户端发送来的序列号和报告自己的窗口大小。但是服务器要是向客户端回传一个信息呢?比如 http 请求的时候回复一个网页,那么客户端是如何确认的呢?是这个时候服务器和客户端的角色交换了吗?如果交换的话,那是不是还得三次握手?

2166 次点击
所在节点    问与答
13 条回复
misaka19000
2016-12-20 09:18:29 +08:00
不是很熟悉 TCP ,我记得好像有个 ACK 可以用于确认送达了吧?
pagxir
2016-12-20 09:20:57 +08:00
你确定你认真看啦。你不知道 tcp 连接的数据传输是双向的么
pumpkin
2016-12-20 09:23:24 +08:00
@pagxir 我知道是双向的,可是双向是两边都是都同时扮演两个角色吗?
HunterPan
2016-12-20 09:23:57 +08:00
ack 你看到没有..
SevenJ
2016-12-20 09:24:41 +08:00
建立链接后, client 和 server 对于 TCP 来说就没啥区别,双方都 Ack, Seq, 你用 wireshark 可以抓包看下
flicker317
2016-12-20 09:25:06 +08:00
TCP 是全双工的, 3 次握手完成, 建立连接后, 客户端与服务端是等价的, 一端发送信息, 另一端都要用单独的 ack 报文确认, 有时候 ack 会跟着数据报文捎带过去. http 协议是单工的, 一次 http 请求经过下面几个过程, http request(client), http request ack(server), http response(server), http response ack(client)
nfroot
2016-12-20 09:26:27 +08:00
TCP 通讯的时候会反复确认“你 TM 收到这一段没?”,对方反馈收到了就传下一段。(实务中会多段一起发送,哪段没收到重发哪段)

而 UDP 是一窝蜂的传过去,管你收不收得到。
BOYPT
2016-12-20 09:27:51 +08:00
“服务端一直都是在确认客户端发送来的序列号和报告自己的窗口大小”

这里理解错了,应该是“双方一直都是在确认对方发送来的序列号和报告自己的窗口大小”
pumpkin
2016-12-20 09:29:34 +08:00
@flicker317
@SevenJ
这样啊,看来是我把 http 中的 server , client 和 TCP 中的搞混淆了。感谢各位
pumpkin
2016-12-20 09:31:53 +08:00
@BOYPT 那意思是维护一个链接,同时需要两个窗口么,一个是发送的时候用的,一个是接收的时候用的,可以这么理解么
BOYPT
2016-12-20 09:45:54 +08:00
@pumpkin 考虑通信双方的话,就 4 个了;
BOYPT
2016-12-20 09:51:48 +08:00
@pumpkin 不过发送方的“窗口”不是完整窗口,而是根据对方的接受窗口估算一个发送长度,一定要理解成对方窗口的同步状态也不是不行;
easing
2016-12-20 13:12:09 +08:00
TCP 是双工的

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

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

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

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

© 2021 V2EX