当前位置: 首页 > wzjs >正文

免费空间网站云搜索系统

免费空间网站,云搜索系统,哪个网站可以做记录视频,海口网站自助建站1. 实验目的 lab2 的目的是实现tcp的接收端。 主要包括两方面 (1) 从发送端接收消息,使用Reassembler聚合字节流(Bytestream) (2)将确认号(ackno)和window size发回对端 …

1. 实验目的

lab2 的目的是实现tcp的接收端。

主要包括两方面

(1) 从发送端接收消息,使用Reassembler聚合字节流(Bytestream

(2)将确认号(ackno)和window size发回对端

确认号,也就是first_unassembler byte; 而Bytestream可写入的大小,

也就是window size!

acknowindow size两个共同描述了发送方能发送的数据范围。有时我们也叫

ackno⇔left edgeackno+window size⇔right edge ackno \Leftrightarrow left \ edge\\ ackno + window\ size \Leftrightarrow right\ edge acknoleft edgeackno+window sizeright edge

这个实验中最困难的部分在于TCP如何在流中表示每一个字节,也就是序列号(sequence number)。

2 实验内容

2.1 序列空间的转换

个人感觉是这个实验比较难的一部分。

我们在Reassebler中的索引是64位的,它足够大几乎不会重叠。

(假如传输速度为100Gbps, 几乎要花50年才能到达2642^{64}264, 而只需要1/3秒就能到达2322^{32}232)。

但在TCP中的序列空间是宝贵的,只有32位。这就带来了一些额外的问题:

  • wrap arround回滚,32位的序列空间只有4GB,0~232−12^{32}-12321, 超过了这个范围就又会从0开始
  • TCP seq numberTCP序列号为了安全,是从一个随机数开始的,它并不从0开始。开始的数我们叫它ISN(Initial Sequance Number, 初始随机数)。
  • SYN FIN各自占据一个序列号空间

我们这里就涉及到三种序列号索引空间了。

  • TCP 序列号索引
  • 绝对序列号
  • 流索引

文档中也给了差别比较的表格
在这里插入图片描述
在这里插入图片描述
序列号索引就是在TCP中的数字;而绝对序列号就是以0开始的,它不会发生回滚。面流索引就是收到的数据的标号了,就不包括SYN FIN

流索引和绝对序列索引就只差一个1

而序列号与绝对序列号的转换就需要我们实现了。

从绝对序列号转换为序列号,比较简单。

只需要zero_point + n就可以了。返回值就会自动回滚。

而让我感觉到最困难的就是323232位的序列号转换成646464位的绝对序列号了。

事实上文档中给出了解决的方法了,它的提示说不管如何转换。在32位的

序列号中的差值和64位绝对序列号中的差值肯定是一样的。

而它函数中的checkpoint则是离当前64位序列号最近的一个, 用first unassembler idx来充当。

为什么需要这个checkpoint呢?因为一个32位的seq number可以对应很多个64位的绝对序列号!!!

比如seqno=7 ,就可能对应7 7+2^{32} 7 + 2^{33} ... , 因此需要一个checkpoint来确定到底是哪一个,我们要的是离checkpoint最近的,比如说seqno = 7, checkpoint =6 + 2^{32},我们一下就能确定abs seqno=7 +2^{32}

这里还有个难点就是理解这个最近,由于32位置的空间它是回滚的,因此

距离也是有两个的!!!

在这里插入图片描述

还是看代码吧!

*wrapping_integers.cc

#include "wrapping_integers.hh"
#include "debug.hh"using namespace std;Wrap32 Wrap32::wrap( uint64_t n, Wrap32 zero_point )
{// Your code here.// debug( "unimplemented wrap( {}, {} ) called", n, zero_point.raw_value_ );return zero_point + static_cast<uint32_t>( n & 0xFFFFFFFF );
}uint64_t Wrap32::unwrap( Wrap32 zero_point, uint64_t checkpoint ) const
{// Your code here.// debug( "unimplemented unwrap( {}, {} ) called", zero_point.raw_value_, checkpoint );auto check_seq = wrap( checkpoint, zero_point).raw_value_;static constexpr uint64_t _2pow32 = static_cast<uint64_t> (1) << 32;uint64_t df1 = static_cast<uint64_t>( raw_value_ ) + _2pow32 - check_seq;if ( df1 >= _2pow32)df1 -= _2pow32;auto df2 = _2pow32 - df1;if ( df2 < df1 && checkpoint >= df2)return checkpoint - df2;elsereturn checkpoint + df1;}
2.2 实现tcp_receiver

实现这个tcp_receiver倒是没有实现序列号花的时间多。

状态管理也没有用状态机的那一套,用if-else过完样例。。。

主要遇到问题是,由于SYN它是需要占据一个序列号, 也就是ISN,而

之后数据中的zero_point应该是ISN + 1了。还有些小问题后面遇到测试

样例排查一下也能过。

最终还是看代码吧!

#include "tcp_receiver.hh"
#include "debug.hh"using namespace std;void TCPReceiver::receive( TCPSenderMessage message )
{// Your code here.// debug( "unimplemented receive() called" );// (void)message;if ( message.RST ) {this->reassembler_.reader().set_error();return ;}if ( message.SYN  && (not is_con)) {ISN = message.seqno ;is_con = true;}if ( is_con ) {Wrap32 cur{message.seqno};if (message.SYN)cur = cur + 1;uint64_t first_idx_ = cur.unwrap( ISN.value() + 1 , this->reassembler_.get_first_unassembler_idx());debug("payload: {}, size: {}, FIN: {}", message.payload, message.payload.size(), message.FIN ? "true": "false");this->reassembler_.insert( first_idx_, message.payload, message.FIN);}// first_idx
}TCPReceiverMessage TCPReceiver::send() const
{// Your code here.// debug( "unimplemented send() called" );// return {};TCPReceiverMessage msg{};if ( is_con ) {auto ackno = reassembler_.get_first_unassembler_idx();if (reassembler_.writer().is_closed())ackno++;msg.ackno = Wrap32::wrap(  ackno, ISN.value() + 1);}auto wnd_sz = reassembler_.writer().available_capacity() ;msg.window_size = wnd_sz > UINT16_MAX ? UINT16_MAX : wnd_sz ;msg.RST = reassembler_.writer().has_error();return msg;
}

3. 遇到的问题

  • 序列号转绝对序列号
  • FIN SYN需要占据一个序列号空间,这影响到了unwrap中的zero_point,同时在最后关闭时,ackno也需要多加1
  • bytestream中的available_capacityuint64_t, 而序列号空间最大UINT16_MAX,需要进行限制
  • RST标志位,需要根据RST来设置bytestream.set_error()
http://www.dtcms.com/wzjs/334332.html

相关文章:

  • 做ppt比较好的网站有哪些关键词网络推广企业
  • 做彩票网站是违法百度知道电脑版网页入口
  • 五大类型网站大数据培训机构排名前十
  • 毕业设计代做的网站靠谱吗百度seo排名优化如何
  • 黑龙江网站建站建设排名优化哪家专业
  • 网站开发的四个高级阶段包括谷歌香港google搜索引擎入口
  • 怎样用别人的网站做修改病句杭州seo优化公司
  • 上海市建设工程协会网站长沙网络推广小公司
  • 重庆网站建设推广公司海南百度推广总代理
  • 火花机 东莞网站建设淘宝站外引流推广方法
  • 桂林北站到象鼻山景区怎么坐车最好的bt磁力搜索引擎
  • 驻马店做网站哪家好产品推广渠道有哪些方式
  • 网站开发人员的工资百度客服转人工
  • 最新网站模板免费下载网络服务器价格
  • 企业建设网站的今天国际新闻大事
  • 网站重复口碑营销怎么做
  • 做外贸相关的网站软广告经典例子
  • 建网站专用网站做任务赚佣金的平台
  • 做食品网站需要什么资质搜索引擎优化期末考试答案
  • 心理测评做测试的网站搜索大全搜索引擎
  • wordpress栏目id专业网站优化推广
  • 有域名 如何免费建设网站最新新闻热点话题
  • 陕西省建设执业注册中心网站鸿星尔克网络营销案例分析
  • 长沙好的网站建设公司哪家好网盟推广
  • 村建站全称搜索引擎营销的分类
  • 游戏推广对接平台seo怎么去优化
  • 网站为什么要挂服务器网店代运营正规公司
  • 做网站的微信号株洲seo推广
  • 金坛网站建设哪家好网站关键词优化系统
  • 家居网站应该怎么做优化大师的功能有哪些