1,发端:
1)会按照设置的最大segment对于应用层下发的数据包进行分片;
最大segment长度:u16_t mss; /* maximum segment size */
2)分片操作: do_writemore中的tcp_write(循环组装segment):
while (pos < len) {
2,收端:
只需要按照segment接收处理即可,不需要考虑segment是否来自不同的分组。
1)底层通过INPKT Msg来触发TCP_input接口函数,会调用tcp的recv函数:
TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); 这个事件会调用recv_tcp,将收到的segment post到conn->recvmbox中去:
sys_mbox_trypost(&conn->recvmbox, p)
2)当上层调用了recv函数(例如netconn->recv)时,会触发netconn_recv_data,其中包括在conn->recvmbox上取data的操作:
sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0);
本文深入探讨了TCP协议中数据包的分片与重组过程,从发端和收端两个角度出发,详细解释了如何按照设置的最大segment进行数据包分片,以及收端如何仅需按照segment接收处理,不需考虑分片来自不同分组。包括底层通过INPKTMsg触发的TCP_input接口函数、接收处理流程以及上层调用recv函数时的数据获取方式。
1179





