先列举几个问题作为以后所有同系列文章的疑点:

  • 荷兰问题:使用运营商(局方)的测试工具(包括客户端和服务端程序)测试,上传和下载的吞吐量都不高,但是使用我们自己的测试工具则正常,不过运营商坚持他们的测试工具是没问题的,如何证明是运营商的工具问题?
  • 拉脱维亚问题:使用DOS下的FTP进行上传,吞吐量正常,但在浏览器中进行FTP上传的吞吐量很低。
  • 南非问题:终端收到前向的包,但CRC校验出错,分析发现TCP净荷出错而且位置固定。
    通过抓包分析问题与定位问题。

  • 哪些因素会触发TCP发送端发包?发包数量怎么计算?

  • 哪些因素会触发TCP接收端回复ACK且数据送往应用层?

Windows下TCP/IP协议栈的实现

实现原理

这里只对Socket接口和AFD做简单介绍。

windows协议栈

Socket :
Windows Socket应用程序通过Socket接口与操作系统进行通信,控制数据的收发。

AFD :

Ancillary Function Driver for Winsock, AFD provides the winsock interface, which is used by most network applications in Windows …
AFD.SYS负责管理应用程序的缓冲区,当应用程序调用send()发送数据时,AFD.SYS将会把数据从应用程序提供的缓冲区(APP发送buffer)拷贝进它自己的内部缓冲区(TCP发送buffer),然后send()函数立即返回,AFD.SYS在后台负责把数据发出去,如果应用程序要求发送的数据超过了缓冲区大小,那send()就会出现阻塞,直到所有数据发送完毕。

接收数据的情况其实也类似,只要接收的数据还没有超过缓冲区(TCP接受buffer)的大小,AFD.SYS将把数据先拷贝到它的内部缓冲区里,当应用程序调用recv()函数时,数据就会从内部缓冲区拷贝到应用程序的缓冲区(APP接收buffer)。