接收包處理:
quic_process_packet_inte***ce.h
這個標頭檔案中有個只包含乙個類
// a class to process each incoming packet. 意思是乙個處理所有到來包的類
class processpacketinte***ce
virtual void processpacket(const quicsocketaddress& server_address,
const quicsocketaddress& client_address,
const quicreceivedpacket& packet) = 0;
};
quic_client_epoll_network_helper.h中繼承這個類
// from processpacketinte***ce. this will be called for each received
// packet.
意思為接收到包後便會呼叫這個函式
void processpacket(const quicsocketaddress& self_address,
const quicsocketaddress& peer_address,
const quicreceivedpacket& packet) override;
該函式呼叫 client_->session()->processu***acket(self_address, peer_address, packet);
跳轉到
void quicsession::processu***acket(const quicsocketaddress& self_address,
const quicsocketaddress& peer_address,
const quicreceivedpacket& packet)
再次跳轉到quicconnection::processu***acket
其中呼叫framer_.processpacket(packet)
// pass a udp packet into the framer for parsing.
// return true if the packet was processed succesfully. |packet| must be a
// single, complete udp packet (not a frame of a packet). this packet
// might be null padded past the end of the payload, which will be correctly
// ignored.
意思是處理乙個完整的udp包,處理成功返回true
bool processpacket(const quicencryptedpacket& packet);
處理流程
為建立乙個reader物件
quicdatareader reader(packet.data(), packet.length(), perspective_,
endianness());
首先處理包頭
建立包頭物件 quicpacketpublicheader public_header;
呼叫processpublicheader(&reader, &public_header)處理
流程:
其中處理為先處理包型別
判斷如果為客戶端傳來的資訊則進行版本判斷和相容
然後處理nonce包,這個包只能由服務端發給客戶端
之後呼叫rv = processdatapacket(&reader, public_header, packet, buffer,
kmaxpacketsize);
跳轉到bool quicframer::processdatapacket
首先將包頭未驗證的部分進行加入header
processunauthenticatedheader(encrypted_reader, &header)
然後解密包
decryptpayload(encrypted_reader, header, packet, decrypted_buffer,
buffer_length, &decrypted_length)
再設定最後的packet number
setlastpacketnumber(header);
處理資料
processframedata
bool quicframer::processframedata
其中quicstringpiece data;
reader->readstringpiece(&data, data_len)
讀取資料內容
讀取完後一直跳轉到 quicframer::processframedata的processstreamframe執行完
然後會處理ack 幀 processackframe(reader, frame_type, &frame)
處理完後根據frame_type進行對應的資料處理
假如是 connection_close_frame會呼叫processconnectioncloseframe(reader, &frame)
其中quicstringpiece error_details;
if (!reader->readstringpiece16(&error_details)) ;padding_frame:為填充位元組幀,接收到這個包時會將包剩餘部分填充位元組
rst_stream_frame:當由流的建立者傳送時,表示建立者希望關閉流,當由接收者傳送時,表示發生錯誤或者不想接收流,因此流應該被關閉
connection_close_frame:連線關閉
goaway_frame:表示流應該被停止使用,因為之後將會被關閉,在使用的流將被繼續處理,但是傳送者不會在接收流
window_update_frame:用於通知對端流量控制埠接收視窗大小的更新
blocked_frame:表示已經準備好傳送資料且有資料要傳送,但是被阻塞了
stop_waiting_frame:通知對端不需要等待包號小於特定值的包
stream_frame:用於傳送資料
ack_frame:通知對端哪些包被接收到了
以上皆為初學者的理解,僅供參考。
QUIC的那些事 包型別及格式
目錄 報文頭特殊報文 版本協商報文 public reset報文 普通報文 regular packet 幀包 frame packet fec包 fec packet 參考資料 quic 的 packet 除了個別報文比如 public reset 和 chlo,所有報文頭部都是經過認證的,報文 ...
資料接收中粘包及半包的處理
在使用tcp協議的網路應用中,不可避免需要處理的乙個問題就是半包和粘包的情況。一種做法是在接收端設乙個比較大的緩衝區,先將收到的資料報都放到緩衝區中,然後從該緩衝區中選取完整的資料報出來。該緩衝區的實現可以使用環形緩衝區進行優化,避免頻繁的資料移動。使用該方法的乙個描述見 http www.vckb...
資料接收中粘包及半包的處理
在使用tcp協議的網路應用中,不可避免需要處理的乙個問題就是半包和粘包的情況。一種做法是在接收端設乙個比較大的緩衝區,先將收到的資料報都放到緩衝區中,然後從該緩衝區中選取完整的資料報出來。該緩衝區的實現可以使用環形緩衝區進行優化,避免頻繁的資料移動。使用該方法的乙個描述見 另外一種做法就是在接收的時...