Kiprey / Kiprey.github.io

This is Kiprey‘s Blog.
https://kiprey.github.io/
4 stars 3 forks source link

CS144计算机网络 Lab3 | Kiprey's Blog #75

Open Kiprey opened 2 years ago

Kiprey commented 2 years ago

https://kiprey.github.io/2021/11/cs144-lab3/

puppet12306 commented 2 years ago

初始的重传时间应该是在构造函数里面给出的那个initial值吧,不应该等于-1才对

Kiprey commented 2 years ago

@puppet12306 初始的重传时间应该是在构造函数里面给出的那个initial值吧,不应该等于-1才对

是的,没啥问题?

puppet12306 commented 2 years ago

我后面看到了你是在第一次调用fillwindow里面设置了初值,我感觉为了鲁棒性似乎直接在构造函数里面赋初值会更好一点?

puppet12306 commented 2 years ago

然后数据包其实是顺序发送的,所以重传备份用队列复杂度应该会更低一些

Kiprey commented 2 years ago

@puppet12306 我后面看到了你是在第一次调用fillwindow里面设置了初值,我感觉为了鲁棒性似乎直接在构造函数里面赋初值会更好一点?

_timeout 需要在每次发送数据包时都重设一遍,因为当有数据包超时时,_timeout 会递增,需要在后续发送数据包时进行重置。

因此无论是否需要在构造函数里赋初值,fill windows 时都需要重新设置 _timeout

Kiprey commented 2 years ago

@puppet12306 然后数据包其实是顺序发送的,所以重传备份用队列复杂度应该会更低一些

确实用队列会更简单一点,当初实现只是为了存下 <seqno, TCPSegment> 这样的键值对,其实可以不用上 map 直接上 queue<pair<int, TCPSegment>>

puppet12306 commented 2 years ago

了解了

chang-you-ren8 commented 1 year ago

对于ack_received函数是否存在两个先后到达的segment1 = [ackno = 10, window_size = 100], segment2 = [ackno = 10, window_size = 10]的情况呢?

Kiprey commented 1 year ago

@chang-you-ren8 对于ack_received函数是否存在两个先后到达的segment1 = [ackno = 10, window_size = 100], segment2 = [ackno = 10, window_size = 10]的情况呢?

我觉得应该是有可能的,但无论发送方下次发送 10 还是 100 字节,个人认为都不会影响到接收方的接受逻辑。

Arashimu commented 1 year ago

能问下TCPSender::fill_window()中 const size_t payload_size = min(TCPConfig::MAX_PAYLOAD_SIZE, curr_window_size - _outgoing_bytes - segment.header().syn)为什么要减去_outgoing_bytes 吗,是因为Sender为了保险起见,防止在未来某个时刻,这些未接收的包被接收,导致接收方接收缓存溢出,

Kiprey commented 1 year ago

@Arashimu 能问下TCPSender::fill_window()中 const size_t payload_size = min(TCPConfig::MAX_PAYLOAD_SIZE, curr_window_size - _outgoing_bytes - segment.header().syn)为什么要减去_outgoing_bytes 吗,是因为Sender为了保险起见,防止在未来某个时刻,这些未接收的包被接收,导致接收方接收缓存溢出,

  1. 主要是防止 Sender 发出去的数据所占本地内存过多,毕竟这些正在发送(outgoing)的数据都需要让 Sender 在收到 Receiver 的 ACK 之前一直维护着。

  2. 无论 Sender 怎么发送数据,Receiver 都不会遇到缓存溢出的错误,因为当 Receiver 检测到本机缓存要存不下时,后面的数据都会被直接丢弃。

Arashimu commented 1 year ago

@Kiprey

@Arashimu 能问下TCPSender::fill_window()中 const size_t payload_size = min(TCPConfig::MAX_PAYLOAD_SIZE, curr_window_size - _outgoing_bytes - segment.header().syn)为什么要减去_outgoing_bytes 吗,是因为Sender为了保险起见,防止在未来某个时刻,这些未接收的包被接收,导致接收方接收缓存溢出,

  1. 主要是防止 Sender 发出去的数据所占本地内存过多,毕竟这些正在发送(outgoing)的数据都需要让 Sender 在收到 Receiver 的 ACK 之前一直维护着。

  2. 无论 Sender 怎么发送数据,Receiver 都不会遇到缓存溢出的错误,因为当 Receiver 检测到本机缓存要存不下时,后面的数据都会被直接丢弃。

也就是说,如果不考虑本地内存,理想上,Sender发送数据时只考虑当前发送数据payload的大小与接收方发过来的窗口大小的大小关系,可以这样理解吗

Kiprey commented 1 year ago

@Arashimu

@Kiprey

@Arashimu 能问下TCPSender::fill_window()中 const size_t payload_size = min(TCPConfig::MAX_PAYLOAD_SIZE, curr_window_size - _outgoing_bytes - segment.header().syn)为什么要减去_outgoing_bytes 吗,是因为Sender为了保险起见,防止在未来某个时刻,这些未接收的包被接收,导致接收方接收缓存溢出,

  1. 主要是防止 Sender 发出去的数据所占本地内存过多,毕竟这些正在发送(outgoing)的数据都需要让 Sender 在收到 Receiver 的 ACK 之前一直维护着。

  2. 无论 Sender 怎么发送数据,Receiver 都不会遇到缓存溢出的错误,因为当 Receiver 检测到本机缓存要存不下时,后面的数据都会被直接丢弃。

也就是说,如果不考虑本地内存,理想上,Sender发送数据时只考虑当前发送数据payload的大小与接收方发过来的窗口大小的大小关系,可以这样理解吗

我是这么理解的,因为貌似除了这些因素之外也没有别的因素可以考虑了。