需要注意的是:
转换相对与绝对序列号:
(1)相对转绝对,实际上就是找checkponit最接近的相对序列号对应的绝对序列号
(2)那么只需比较包含checkpoint两端的绝对序列号,取最近一端
(3)特殊情况:checkpoint靠左端绝对序列号最近,但左端序列号小于0
接收发送部分:
(1)下一个ackno相对序列号需要由
is_zero_set is_close bytes_pushed zero_point 决定
(2)错误信息RST 就是ByteStream里的错误
(3)窗口大小由ByteStream的剩余容量决定:
且注意若超过UINT16_MAX,取UINT16_MAX
(4)注意处理数据报首位相对序列号:
若有SYN,取下一位首位相对序列号
然后再转首位绝对序列号(若为0,说明首位相对序列号与SYN相同,但由于我们已经排除SYN,故此时为无效信息)
首位绝对序列号再转流序列号
TCP Receiver流程图(已经绑定在文章上):
wrapping_integers.cc :
#include "wrapping_integers.hh"
using namespace std;
/**
* 绝对转相对
@param n 绝对序列号
@param zero_point 初始序列号
@return Wrap32 相对序列号
static_cast<uint32_t>(n) 相当于n取模2^32(转换过程取低32位)
*/
Wrap32 Wrap32::wrap( uint64_t n, Wrap32 zero_point )
{
uint32_t relative_ = static_cast<uint32_t>( n ) + zero_point.raw_value_;
return Wrap32 { relative_ }