网站如何提升流量,比较好写的电子商务论文题目,电影网站如何做采集,宝塔为什么要安装Wordpress一、实验目的
1.实现一个流重组器——一个将字节流的小块 #xff08;称为子串或段 #xff09;按正确顺序组装成连续的字节流的模块#xff1b;
2.深入理解 TCP 协议的工作方式。
二、实验内容
编写一个名为StreamReassembler的数据结构#xff0c;它负责…一、实验目的
1.实现一个流重组器——一个将字节流的小块 称为子串或段 按正确顺序组装成连续的字节流的模块
2.深入理解 TCP 协议的工作方式。
二、实验内容
编写一个名为StreamReassembler的数据结构它负责重新组装数据。该结构将接收子串由一串字节和大数据流中该串的第一个字节的索引组成并提供一个名为ByteStream的输出其中所有的数据都被正确排序。
三、实验过程
在minnow目录下输入 git fetch 更新本地源仓库此处显示更新失败是因为本次实验开始时源仓库已经最新无需再次更新 输入git merge origin/check1-startercode获取Lab1 获取后输入cmake --build build来判断代码目前是否正常结果为正常 用文本编辑器查看./src/reassembler.hh 修改代码代码分析见注释 用文本编辑器查看./src/reassembler.cc 修改代码代码分析见注释 保存并编译 输入make check1测试程序 全部通过
四、实验体会
1.下图完整地显示了CS144 这门实验的结构 ByteStream 是我们已经在 Lab0 中实现完成的。
我们在Lab1 中实现一个流重组器一个将字节流的字串或者小段按照正确顺序来拼接回连续字节流的模块。
2.流重组器在 TCP 起到了相当重要的作用。迫于网络环境的限制TCP 发送者会将数据切割成一个个小段的数据分批发送。但这就可能带来一些新的问题数据在网络中传输时可能丢失、重排、多次重传等等。而TCP接收者就必须通过流重组器将接收到的这些重排重传等等的数据包重新组装成新的连续字节流。
3.在调试的时候所有的评测程序位于build/tests/中进入此位置进行调试。
五、代码附录
reassembler.hh
#pragma once#include byte_stream.hh#include string
#include list
#include tupleclass Reassembler
{bool had_last_ {}; // 是否已经插入了最后一个字符串uint64_t next_index_ {}; // 下一个要写入的字节的索引uint64_t buffer_size_ {}; // buffer_中的字节数std::liststd::tupleuint64_t, uint64_t, std::string buffer_ {};/*** \breif 将data推入output流.*/void push_to_output(std::string data, Writer output);/*** \brief 将data推入buffer暂存区.* \param first_index data的第一个字节的索引* \param last_index data的最后一个字节的索引* \param data 待推入的字符串, 下标为[first_index, last_index]闭区间*/void buffer_push( uint64_t first_index, uint64_t last_index, std::string data );/*** 尝试将buffer中的串推入output流.*/void buffer_pop(Writer output);public:/** Insert a new substring to be reassembled into a ByteStream.* first_index: the index of the first byte of the substring* data: the substring itself* is_last_substring: this substring represents the end of the stream* output: a mutable reference to the Writer** The Reassemblers job is to reassemble the indexed substrings (possibly out-of-order* and possibly overlapping) back into the original ByteStream. As soon as the Reassembler* learns the next byte in the stream, it should write it to the output.** If the Reassembler learns about bytes that fit within the streams available capacity* but cant yet be written (because earlier bytes remain unknown), it should store them* internally until the gaps are filled in.** The Reassembler should discard any bytes that lie beyond the streams available capacity* (i.e., bytes that couldnt be written even if earlier gaps get filled in).** The Reassembler should close the stream after writing the last byte.*/void insert( uint64_t first_index, std::string data, bool is_last_substring, Writer output );// How many bytes are stored in the Reassembler itself?uint64_t bytes_pending() const;
};reassembler.cc
#include reassembler.hh#include ranges
#include algorithmusing namespace std;
void Reassembler::push_to_output( std::string data, Writer output ) {next_index_ data.size();output.push( move( data ) );
}void Reassembler::buffer_push( uint64_t first_index, uint64_t last_index, std::string data )
{// 合并区间auto l first_index, r last_index;auto beg buffer_.begin(), end buffer_.end();auto lef lower_bound( beg, end, l, []( auto a, auto b ) { return get1( a ) b; } );auto rig upper_bound( lef, end, r, []( auto b, auto a ) { return get0( a ) b; } );if (lef ! end) l min( l, get0( *lef ) );if (rig ! beg) r max( r, get1( *prev( rig ) ) );// 当data已在buffer_中时直接返回if ( lef ! end get0( *lef ) l get1( *lef ) r ) {return;}buffer_size_ 1 r - l;if ( data.size() r - l 1 lef rig ) { // 当buffer_中没有data重叠的部分buffer_.emplace( rig, l, r, move( data ) );return;}string s( 1 r - l, 0 );for ( auto it : views::iota( lef, rig ) ) {auto [a, b, c] *it;buffer_size_ - c.size();ranges::copy(c, s.begin() a - l);}ranges::copy(data, s.begin() first_index - l);buffer_.emplace( buffer_.erase( lef, rig ), l, r, move( s ) );
}void Reassembler::buffer_pop( Writer output ) {while ( !buffer_.empty() get0( buffer_.front() ) next_index_ ) {auto [a, b, c] buffer_.front();buffer_size_ - c.size();push_to_output( move( c ), output ); buffer_.pop_front();}if ( had_last_ buffer_.empty() ) {output.close();}
}void Reassembler::insert( uint64_t first_index, string data, bool is_last_substring, Writer output )
{if ( data.empty() ) {if ( is_last_substring ) {output.close();}return;}auto end_index first_index data.size(); // data: [first_index, end_index)auto last_index next_index_ output.available_capacity(); // 可用范围: [next_index_, last_index)if ( end_index next_index_ || first_index last_index ) {return; // 不在可用范围内, 直接返回}// 调整data的范围if ( last_index end_index ) {end_index last_index;data.resize( end_index - first_index );is_last_substring false;}if ( first_index next_index_ ) {data data.substr( next_index_ - first_index );first_index next_index_;}// 若data可以直接写入output, 则直接写入if ( first_index next_index_ ( buffer_.empty() || end_index get1( buffer_.front() ) 2 ) ) {if ( buffer_.size() ) { // 若重叠, 则调整data的范围data.resize( min( end_index, get0( buffer_.front() ) ) - first_index );}push_to_output( move( data ), output );} else { // 否则, 将data插入buffer_buffer_push( first_index, end_index - 1, data );}had_last_ | is_last_substring;// 尝试将buffer_中的数据写入outputbuffer_pop(output);
}uint64_t Reassembler::bytes_pending() const
{return buffer_size_;
} 文章转载自: http://www.morning.rcww.cn.gov.cn.rcww.cn http://www.morning.mwlxk.cn.gov.cn.mwlxk.cn http://www.morning.xxhc.cn.gov.cn.xxhc.cn http://www.morning.rqqn.cn.gov.cn.rqqn.cn http://www.morning.prmbn.cn.gov.cn.prmbn.cn http://www.morning.zqwqy.cn.gov.cn.zqwqy.cn http://www.morning.ykbgs.cn.gov.cn.ykbgs.cn http://www.morning.yjqkk.cn.gov.cn.yjqkk.cn http://www.morning.fhyhr.cn.gov.cn.fhyhr.cn http://www.morning.pymff.cn.gov.cn.pymff.cn http://www.morning.rlpmy.cn.gov.cn.rlpmy.cn http://www.morning.hlyfn.cn.gov.cn.hlyfn.cn http://www.morning.sjqpm.cn.gov.cn.sjqpm.cn http://www.morning.nzmw.cn.gov.cn.nzmw.cn http://www.morning.wschl.cn.gov.cn.wschl.cn http://www.morning.qnftc.cn.gov.cn.qnftc.cn http://www.morning.dthyq.cn.gov.cn.dthyq.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn http://www.morning.qfths.cn.gov.cn.qfths.cn http://www.morning.qfths.cn.gov.cn.qfths.cn http://www.morning.bdqpl.cn.gov.cn.bdqpl.cn http://www.morning.jzgxp.cn.gov.cn.jzgxp.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.ctqbc.cn.gov.cn.ctqbc.cn http://www.morning.owenzhi.com.gov.cn.owenzhi.com http://www.morning.hcsnk.cn.gov.cn.hcsnk.cn http://www.morning.nkbfc.cn.gov.cn.nkbfc.cn http://www.morning.pqkgb.cn.gov.cn.pqkgb.cn http://www.morning.jppdk.cn.gov.cn.jppdk.cn http://www.morning.mydgr.cn.gov.cn.mydgr.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.tmlhh.cn.gov.cn.tmlhh.cn http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn http://www.morning.ylyzk.cn.gov.cn.ylyzk.cn http://www.morning.zqybs.cn.gov.cn.zqybs.cn http://www.morning.jwtjf.cn.gov.cn.jwtjf.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.phxdc.cn.gov.cn.phxdc.cn http://www.morning.rmdwp.cn.gov.cn.rmdwp.cn http://www.morning.gjlml.cn.gov.cn.gjlml.cn http://www.morning.kfbth.cn.gov.cn.kfbth.cn http://www.morning.clhyj.cn.gov.cn.clhyj.cn http://www.morning.yghlr.cn.gov.cn.yghlr.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn http://www.morning.ljxxl.cn.gov.cn.ljxxl.cn http://www.morning.kjnfs.cn.gov.cn.kjnfs.cn http://www.morning.wmfny.cn.gov.cn.wmfny.cn http://www.morning.wclxm.cn.gov.cn.wclxm.cn http://www.morning.brtxg.cn.gov.cn.brtxg.cn http://www.morning.rlns.cn.gov.cn.rlns.cn http://www.morning.pctql.cn.gov.cn.pctql.cn http://www.morning.hyryq.cn.gov.cn.hyryq.cn http://www.morning.tlfzp.cn.gov.cn.tlfzp.cn http://www.morning.jmwrj.cn.gov.cn.jmwrj.cn http://www.morning.gjfym.cn.gov.cn.gjfym.cn http://www.morning.rswfj.cn.gov.cn.rswfj.cn http://www.morning.pcqxr.cn.gov.cn.pcqxr.cn http://www.morning.rjhts.cn.gov.cn.rjhts.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.ybqlb.cn.gov.cn.ybqlb.cn http://www.morning.pffx.cn.gov.cn.pffx.cn http://www.morning.mywnk.cn.gov.cn.mywnk.cn http://www.morning.wprxm.cn.gov.cn.wprxm.cn http://www.morning.lwrks.cn.gov.cn.lwrks.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn http://www.morning.cnhgc.cn.gov.cn.cnhgc.cn http://www.morning.gghhmi.cn.gov.cn.gghhmi.cn http://www.morning.pqkyx.cn.gov.cn.pqkyx.cn http://www.morning.mgfnt.cn.gov.cn.mgfnt.cn http://www.morning.swwpl.cn.gov.cn.swwpl.cn http://www.morning.gqnll.cn.gov.cn.gqnll.cn http://www.morning.qrlsy.cn.gov.cn.qrlsy.cn http://www.morning.sbrpz.cn.gov.cn.sbrpz.cn http://www.morning.nrbcx.cn.gov.cn.nrbcx.cn http://www.morning.crdtx.cn.gov.cn.crdtx.cn http://www.morning.ltywr.cn.gov.cn.ltywr.cn http://www.morning.sfnr.cn.gov.cn.sfnr.cn