QUIC接收包處理

2021-08-27 11:00:54 字數 3253 閱讀 3254

接收包處理:

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協議的網路應用中,不可避免需要處理的乙個問題就是半包和粘包的情況。一種做法是在接收端設乙個比較大的緩衝區,先將收到的資料報都放到緩衝區中,然後從該緩衝區中選取完整的資料報出來。該緩衝區的實現可以使用環形緩衝區進行優化,避免頻繁的資料移動。使用該方法的乙個描述見 另外一種做法就是在接收的時...