网编(4):TCP原理

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/88934623

TCP 套接字中的I/O缓冲

TCP套接字的数据收发无边界。服务器端即使调用1次write函数传输40字节的数据,客户端也有可能通过4次read函数调用每次读取10字节。但此处也有一些疑问,服务器端一次性传输了40字节,而客户端居然可以缓慢地分批接收。客户端接收10字节后,剩下的30字节在
何处等候呢?是不是像飞机为等待着陆而在空中盘旋一样,剩下30字节也在网络中徘徊并等待接收呢?
实际上, write函数调用后并非立即传输数据, read函数调用后也并非马上接收数据。更准确地说,如图所示, write函数调用瞬间,数据将移至输出缓冲; read函数调用瞬间,从输入缓冲读取数据。

调用write函数时,数据将移到输出缓冲,在适当的时候(不管是分别传送还是一次性传送)传向对方的输入缓冲。这时对方将调用read函数从输入缓冲读取数据。这些I/O缓冲特性可整理如下。

  • I/O缓冲在每个TCP套接字中单独存在。
  • I/O缓冲在创建套接字时自动生成。
  • 即使关闭套接字也会继续传递输出缓冲中遗留的数据。
  • 关闭套接字将丢失输入缓冲中的数据。

“不会发生超过输入缓冲大小的数据传输。”

根本不会发生这类问题,因为TCP会控制数据流。TCP 中有滑动窗口(Sliding Window) 协议,用对话方式呈现如下。

  • 套接宇A:"你好,最多可以向我传递50字节。”
  • 套接宇B: "OK!"
  • 套接宇A:" 我腾出了20 字节的空间,最多可以收70字节。”
  • 套接宇B: "OK!"

Write 函数返回的时间点

write 函数和Windows 的send 函数并不会在完成向对方主机的数据传输时返回,而是在数据移到输出缓冲时。但TCP 会保证对输出缓冲数据的传输,所以说write 函数在数据传输完成时返回。要准确理解这句话。

TCP套接字从创建到消失所经过程分为如下3步。

  • 与对方套接字建立连接。
  • 与对方套接字进行数据交换。
  • 断开与对方套接字的连接。

TCP 内部工作原理1: 与对方套接字的连接

三次握手

TCP 内部工作原理2: 与对方主机的数据交换

图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程。首先,主机A通过1个数据包发送100个字节的数据` 数据包的SEQ为1200 。主机B为了确认这一点,向主机A发送ACK1301 消息。
此时的ACK号为1301而非1201, 原因在千ACK号的增蜇为传输的数据字节数。假设每次ACK号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确100字节全都正确传递还是丢失了一部分,比如只传递了80字节。因此按如下公式传递ACK消息:

ACK 号 = SEQ 号+ 传递的宇节数+ 1

最后加1 是为了告知对方下次要传递的SEQ号。

下面分析传输过程中数据包消失的情况。

上图表示通过SEQ 1301 数据包向主机B传递100字节数据。但中间发生了错误,主机B未收到。经过一段时间后,主机A仍未收到对于SEQ 1301 的ACK确认,因此试着重传该数据包。为了完成数据包重传, TCP套接字启动计时器以等待ACK应答。若相应计时器发生超时(Time-out!)则重传。

TCP 的内部工作原理3: 断开与套接字的连接

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/88934623