2025 cs144 Lab Checkpoint 3: TCP Receiver

1 关于TCP Sender

核心职责:

  • 跟踪接收方窗口的ackno、window_size
  • 尽可能地填充窗口,直到窗口已满或发送完毕
  • 管理未确认的段、超时未确认则重传(ARQ机制
  • 处理SYN、FIN标志,确保流的正确开始和结束

1.1 关键机制

重传超时(RTO)与定时器

TCPSender 的 owner 会周期性地调用 TCPSender 的 tick 方法,表示时间的流逝。TCPSender 负责查看其未完成的 TCPSenderMessages 集合,并确定最早发送的 segment 是否在没有确认的情况下未完成太长时间(即,没有确认其所有序列号)。如果是这样,则需要重新传输 (再次发送) 。

2 实现TCP Sender

2.1 void push( const TransmitFunction& transmit );

要求 TCPSender 从出站字节流填充窗口:它从流中读取并发送尽可能多的 TCPSenderMessages,只要窗口中有要读取的新字节和可用空间。它通过调用提供的 transmit() 函数来发送它们。
您需要确保您发送的每个 TCPSenderMessage 都完全适合接收者的窗口。使每条消息尽可能大,但不要大于 TCPConfig::MAX PAYLOAD SIZE 给出的值。

const TransmitFunction& transmit 函数型参数?

跳转到定义:

  /* Type of the `transmit` function that the push and tick methods can use to send messages */
  using TransmitFunction = std::function<void( const TCPSenderMessage& )>;

作用是,当发送器生成一个待发送的段(如 SYN 段、数据段、FIN 段)时,通过调用 transmit(segment) 将段传递给框架,segment的类型是TCPSenderMessage

从哪里读取字节?

当然是从TCPSender类里自己的字节流input_里读取,此时,TCPSender作为发送方

input_里的数据是哪来的?

构造TCPSender类时放入的,构造TCPSender时,同时还会给定Initial_RTO和ISN

实现

void TCPSender::push(const TransmitFunction& transmit)
{
   
   
  // 首先检查Writer是否存在错误并设置错误状态,有错误的话停止push,并返回空的message
  if (writer().has_error()) {
   
   
    _has_error = true;
    cerr << "DEBUG: writer has error, setting _has_error = true" << endl;
  }

  if (_has_error) {
   
   
    cerr << "DEBUG: _has_error is true in push(), sending RST message" << endl;
    TCPSenderMessage rst_msg = make_empty_message();
    transmit(rst_msg);
    return;
  }
  
  // 如果没有错误,正常处理...
  // 如果可接收的窗口大小为0且没有要重传的消息,则设置窗口大小为1
  uint64_t effective_window = (received_msg.window_size == 0 && outstanding_bytes == 0) ? 1 : received_msg.window_size;
  
  //如果当前的窗口大小可以容纳待重传的消息,则处理数据
  while (outstanding_bytes < effective_window) {
   
   
    TCPSenderMessage msg;
    //发送SYN消息
    if (isSent_ISN == false) {
   
   
      msg.SYN = true;
      msg.seqno = isn_;
      isSent_ISN = 
这是日志2025-12-15 20:40:10 CST LOG: database system was shut down at 2025-12-15 20:39:41 CST 2025-12-15 20:45:10 CST LOG: checkpoint starting: time 2025-12-15 20:45:10 CST LOG: checkpoint complete: wrote 2 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.003 s, total=0.016 s; sync files=3, longest=0.002 s, average=0.001 s; distance=0 kB, estimate=0 kB; lsn=0/BA80ED90, redo lsn=0/BA80ED58 2025-12-15 20:50:10 CST LOG: checkpoint starting: time 2025-12-15 20:50:11 CST LOG: checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.661 s, sync=0.003 s, total=0.674 s; sync files=2, longest=0.002 s, average=0.002 s; distance=8 kB, estimate=8 kB; lsn=0/BA810E70, redo lsn=0/BA810E38 2025-12-15 21:00:39 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-15 21:00:39 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-15 21:01:04 CST ERROR: canceling statement due to user request 2025-12-15 21:01:04 CST LOG: shutting down 2025-12-15 21:01:04 CST LOG: checkpoint starting: shutdown immediate 2025-12-15 21:01:04 CST LOG: checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.001 s, total=0.011 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=7 kB; lsn=0/BA810F20, redo lsn=0/BA810F20 2025-12-16 13:19:02 CST LOG: database system was shut down at 2025-12-15 21:01:04 CST 2025-12-16 13:24:02 CST LOG: checkpoint starting: time 2025-12-16 13:24:02 CST LOG: checkpoint complete: wrote 2 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.003 s, total=0.014 s; sync files=3, longest=0.001 s, average=0.001 s; distance=0 kB, estimate=0 kB; lsn=0/BA811008, redo lsn=0/BA810FD0 2025-12-16 14:44:02 CST LOG: checkpoint starting: time 2025-12-16 14:44:48 CST LOG: checkpoint complete: wrote 421 buffers (2.6%); 0 WAL file(s) added, 0 removed, 0 recycled; write=45.621 s, sync=0.058 s, total=45.691 s; sync files=87, longest=0.003 s, average=0.001 s; distance=3187 kB, estimate=3187 kB; lsn=0/BAB43E08, redo lsn=0/BAB2DE00 2025-12-16 14:59:02 CST LOG: checkpoint starting: time 2025-12-16 14:59:05 CST LOG: checkpoint complete: wrote 28 buffers (0.2%); 0 WAL file(s) added, 0 removed, 0 recycled; write=2.726 s, sync=0.016 s, total=2.751 s; sync files=18, longest=0.003 s, average=0.001 s; distance=123 kB, estimate=2881 kB; lsn=0/BAB4CAA8, redo lsn=0/BAB4CA70 2025-12-16 15:14:02 CST LOG: checkpoint starting: time 2025-12-16 15:14:02 CST LOG: checkpoint complete: wrote 2 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.117 s, sync=0.003 s, total=0.130 s; sync files=2, longest=0.002 s, average=0.002 s; distance=1 kB, estimate=2593 kB; lsn=0/BAB4D1B8, redo lsn=0/BAB4D180 2025-12-16 15:44:02 CST LOG: checkpoint starting: time 2025-12-16 15:44:03 CST LOG: checkpoint complete: wrote 8 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.770 s, sync=0.010 s, total=0.788 s; sync files=8, longest=0.003 s, average=0.002 s; distance=4 kB, estimate=2334 kB; lsn=0/BAB4E478, redo lsn=0/BAB4E440 2025-12-16 15:59:02 CST LOG: checkpoint starting: time 2025-12-16 15:59:05 CST LOG: checkpoint complete: wrote 34 buffers (0.2%); 0 WAL file(s) added, 0 removed, 0 recycled; write=3.385 s, sync=0.031 s, total=3.429 s; sync files=23, longest=0.003 s, average=0.002 s; distance=100 kB, estimate=2110 kB; lsn=0/BAB67720, redo lsn=0/BAB676E8 2025-12-16 16:04:02 CST LOG: checkpoint starting: time 2025-12-16 16:04:10 CST LOG: checkpoint complete: wrote 74 buffers (0.5%); 0 WAL file(s) added, 0 removed, 0 recycled; write=7.759 s, sync=0.044 s, total=7.816 s; sync files=73, longest=0.003 s, average=0.001 s; distance=145 kB, estimate=1914 kB; lsn=0/BAB8BF08, redo lsn=0/BAB8BED0 2025-12-16 16:14:02 CST LOG: checkpoint starting: time 2025-12-16 16:14:03 CST LOG: checkpoint complete: wrote 14 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=1.423 s, sync=0.016 s, total=1.450 s; sync files=13, longest=0.003 s, average=0.002 s; distance=9 kB, estimate=1723 kB; lsn=0/BAB8E480, redo lsn=0/BAB8E448 2025-12-16 16:19:02 CST LOG: checkpoint starting: time 2025-12-16 16:19:03 CST LOG: checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.553 s, sync=0.010 s, total=0.575 s; sync files=6, longest=0.002 s, average=0.002 s; distance=5 kB, estimate=1552 kB; lsn=0/BAB8FA60, redo lsn=0/BAB8FA28 2025-12-16 16:24:45 CST LOG: checkpoint starting: time 2025-12-16 16:24:46 CST LOG: checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.551 s, sync=0.008 s, total=0.572 s; sync files=6, longest=0.002 s, average=0.002 s; distance=6 kB, estimate=1397 kB; lsn=0/BAB91350, redo lsn=0/BAB91318 2025-12-16 16:59:45 CST LOG: checkpoint starting: time 2025-12-16 16:59:49 CST LOG: checkpoint complete: wrote 37 buffers (0.2%); 0 WAL file(s) added, 0 removed, 0 recycled; write=3.710 s, sync=0.021 s, total=3.736 s; sync files=28, longest=0.002 s, average=0.001 s; distance=138 kB, estimate=1271 kB; lsn=0/BABB3C98, redo lsn=0/BABB3C60 2025-12-16 18:35:53 CST LOG: checkpoint starting: time 2025-12-16 18:35:59 CST LOG: checkpoint complete: wrote 55 buffers (0.3%); 0 WAL file(s) added, 0 removed, 0 recycled; write=5.683 s, sync=0.031 s, total=5.726 s; sync files=47, longest=0.002 s, average=0.001 s; distance=124 kB, estimate=1156 kB; lsn=0/BABD2E48, redo lsn=0/BABD2E10 2025-12-16 18:43:13 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-16 18:43:13 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-16 18:48:50 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-16 18:48:50 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-16 18:50:07 CST FATAL: password authentication failed for user "postgres" 2025-12-16 18:50:07 CST DETAIL: Connection matched file "C:/Program Files/PostgreSQL/16/data/pg_hba.conf" line 118: "host all all ::1/128 scram-sha-256" 2025-12-16 18:50:13 CST FATAL: password authentication failed for user "postgres" 2025-12-16 18:50:13 CST DETAIL: Connection matched file "C:/Program Files/PostgreSQL/16/data/pg_hba.conf" line 118: "host all all ::1/128 scram-sha-256" 2025-12-16 18:53:06 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-16 18:53:06 CST LOG: could not receive data from client: An existing connection was forcibly closed by the remote host. 2025-12-16 18:55:53 CST LOG: checkpoint starting: time 2025-12-16 18:55:54 CST LOG: checkpoint complete: wrote 6 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.552 s, sync=0.012 s, total=0.575 s; sync files=6, longest=0.003 s, average=0.002 s; distance=6 kB, estimate=1041 kB; lsn=0/BABD4940, redo lsn=0/BABD4908
12-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值