终于看到了 TCP 协议,这是 TCP/IP 详解里面最重要也是最精彩的部分,要花大力气来读。前面的 TFTP 和 BOOTP 都是一些简单的协议,就不写笔记了,写起来也没啥东西。
TCP 和 UDP 处在同一层---运输层,但是 TCP 和 UDP 最不同的地方是,TCP 提供了一种可靠的数据传输服务,TCP 是面向连接的,也就是说, 利用 TCP 通信的两台主机首先要经历一个“拨打电话”的过程,等到通信准备结束才开始传输数据,最后结束通话。所以 TCP 要比 UDP 可靠的多,UDP 是把 数据直接发出去,而不管对方是不是在收信,就算是 UDP 无法送达,也不会产生 ICMP 差错 报文,这一经时重申了很多遍了。
把 TCP 保证可靠性的简单工作原理摘抄如下
应用数据被分割成 TCP 认为最适合发送的数据块。这和 UDP 完全不同,应用程序产生的 数据报长度将保持不变。
当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能 及时收到一个确认,将重发这个报文段。
当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。
TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输 过程中的任何变化。如果收到段的检验和有差错, TCP 将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此 TCP 报文段 的到达也可能会失序。如果必要, TCP 将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
TCP 还能提供流量控制。TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
从这段话中可以看到,TCP 中保持可靠性的方式就是超时重发,这是有道理的,虽然 TCP 也可以用各种各样的 ICMP 报文来处理这些,但是这也不是可靠的,最可靠的方式就是只要不得到确认,就重新发送数据报,直到得到对方的确认为止。即时通讯定制开发可以咨询蔚可云开发
TCP 的首部和 UDP 首部一样,都有发送端口号和接收端口号。但是显然,TCP 的首部信息要比 UDP 的多,可以看到,TCP 协议提供了发送和确认所需要的所有必要的信息。
可以想象一个 TCP 数据的发送应该是如下的一个过程:
双方建立连接;
发送方给接受方 TCP 数据报,然后等待对方的确认 TCP 数据报,如果没有,就重新发,如果有,就发送下一个数据报;
接受方等待发送方的数据报,如果得到数据报并检验无误,就发送 ACK(确认)数据报,并等待下一个 TCP 数据报的到 来。直到接收到 FIN(发送完成数据报);
中止连接。
可以想见,为了建立一个 TCP 连接,系统可能会建立一个新的进程(最差也是一个线程),来进行数据的传送。