默认
打赏 发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
《TCP/IP详解》学习笔记(九):TCP 协议概述
阅读(58372) | 评论(3 收藏2 淘帖1
微信扫一扫关注!

对应原书章节


《TCP/IP详解 卷1:协议》在线阅读版 - 第17章 TCP:传输控制协议

概述


终于看到了 TCP 协议,这是 TCP/IP 详解里面最重要也是最精彩的部分,要花大力气来读。前面的 TFTP 和 BOOTP 都是一些简单的协议,就不写笔记了,写起来也没啥东西。

TCP 和 UDP 处在同一层---运输层,但是 TCP 和 UDP 最不同的地方是,TCP 提供了一种可靠的数据传输服务,TCP 是面向连接的,也就是说, 利用 TCP 通信的两台主机首先要经历一个“拨打电话”的过程,等到通信准备结束才开始传输数据,最后结束通话。所以 TCP 要比 UDP 可靠的多,UDP 是把 数据直接发出去,而不管对方是不是在收信,就算是 UDP 无法送达,也不会产生 ICMP 差错 报文,这一经时重申了很多遍了。

把 TCP 保证可靠性的简单工作原理摘抄如下


应用数据被分割成 TCP 认为最适合发送的数据块。这和 UDP 完全不同,应用程序产生的 数据报长度将保持不变。由TCP 传递给 IP 的信息单位称为报文段或段( segment)(参见图1 - 7)。在18.4节我们将看到 TCP 如何确定报文段的长度。

当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能 及时收到一个确认,将重发这个报文段。在第21章我们将了解 TCP 协议中自适应的超时 及重传策略。

当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒,这将在19.3节讨论。

TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输 过程中的任何变化。如果收到段的检验和有差错, TCP 将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此 TCP 报文段 的到达也可能会失序。如果必要, TCP 将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

TCP 还能提供流量控制。TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

从这段话中可以看到,TCP 中保持可靠性的方式就是超时重发,这是有道理的,虽然 TCP 也可以用各种各样的 ICMP 报文来处理这些,但是这也不是可靠的,最可靠的方式就是只要不得到确认,就重新发送数据报,直到得到对方的确认为止。

小结


TCP 的首部和 UDP 首部一样,都有发送端口号和接收端口号。但是显然,TCP 的首部信息要比 UDP 的多,可以看到,TCP 协议提供了发送和确认所需要的所有必要的信息。这在 P171-173 有详细地介绍。

可以想象一个 TCP 数据的发送应该是如下的一个过程:

  • 双方建立连接;
  • 发送方给接受方 TCP 数据报,然后等待对方的确认 TCP 数据报,如果没有,就重新发,如果有,就发送下一个数据报;
  • 接受方等待发送方的数据报,如果得到数据报并检验无误,就发送 ACK(确认)数据报,并等待下一个 TCP 数据报的到 来。直到接收到 FIN(发送完成数据报);
  • 中止连接。

可以想见,为了建立一个 TCP 连接,系统可能会建立一个新的进程(最差也是一个线程),来进行数据的传送。

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:TCPIP详解
上一篇:NIO框架详解:Netty的高性能之道下一篇:《TCP/IP详解》学习笔记(十):TCP 连接的建立与中止

本帖已收录至以下技术专辑

推荐方案
评论 3
引用:lttzzlll 发表于 2021-08-26 23:34
文中:“就算是 UDP 无法送达,也不会产生 ICMP 差错 报文,这一经时重申了很多遍了” 和我的理解不一致。UDP ...

假设你是写这个逻辑的人,你试着想一下,你肯定不会把出错逻辑由这条链接中间的每一个环节都有自主反馈给发送者的能力,那这就把整个链路中的每个环节搞复杂了

最简单的逻辑就是,由最终的接收者反馈(就是你看到的那样),如果最终接收者没有反馈那就表示不可达,中间的每个环节都没有主动反馈的义务,它们只是简单的“收到、转发”就这样,这逻辑就简单多了。
文中:“就算是 UDP 无法送达,也不会产生 ICMP 差错 报文,这一经时重申了很多遍了” 和我的理解不一致。UDP就是IP数据报的简单封装,如果一段发送了一个IP数据报,经过一个路由器,发现目的地不可达,那么路由器不会像发送端返回一个ICMP差错报文吗?然后只是发送端主动忽略这个ICMP报文而已?
群主这以晚了还在整这个
签名: 国庆长假还没有缓过来,请让我静一静,产品狗死远点...
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部