我正在查看send()的阻止调用,并查看是否有办法测量在函数中花费的时间,同时能够知道在此期间发生的事件,以便可以进行定性分析关于连接速度等。
有了这个,首先要知道的是该功能在哪个层返回成功。
答案 0 :(得分:0)
send()
API将几乎立即返回成功IFF有足够的缓冲空间可用于保存数据和路由表仍然显示将数据包路由到对等的方法。 (它实际上 无法到达对等点 - 只需要机器必须有下一跳可用...)如果它需要等待缓冲区空间释放,它将。 (通过Wireshark观察在线上确认或发送的数据应该很容易。)
顺便提一下,OSI层不完美地应用于TCP / IP协议族;第1层和第2层非常接近,第3层大致是IP路由,第4层大致是TCP,UDP,SCTP,ICMP等。但是第5层,第6层,第7层没有真正的模拟--TLS上的SMTP可能被认为是第7层,或者SMTP可能是第7层,而TLS是第6层......它们都很快变得非常模糊。
更容易谈谈你很好奇的TCP / IP协议栈中的特定层。 send()
适用于流,数据报和原始套接字,因此它可以跨越堆栈的多个层 - 您可以使用它来发送TCP,UDP,SCTP或ICMP数据包,或者如果您直接在线上涂鸦愿望。