在发送一个数据包的过程中,winsock的具体作用是什么
winsock只是用来向下层转发数据的一个接口,其他的它什么也不做,对吗?
Tcp或Udp头是在winsock层加入的,还是在下一层,比如TDI,或都NDIS加入的?
Tcp的各种机制比如超时重发,滑支窗口是在winsock层实现的,还是在驱动层实现的
甚至是在spi层实现的,具体是怎么样的,有人知道吗?
请大家多多发言

解决方案 »

  1.   

    winsock层???
    这种说法???
    Windows Socket API是一套开放的、支持多种协议的Windows下的网络编程接口,它包 括一个标准的 BerkeleySocket功能调用的集合,以及为Windows所作的重要扩充。
      

  2.   

    winsock只是用来向下层转发数据的一个接口,其他的它什么也不做,对吗?
    是的Tcp或Udp头是在winsock层加入的,还是在下一层,比如TDI,或都NDIS加入的?
    在TDI的TCPIP设备驱动程序实现Tcp的各种机制比如超时重发,滑支窗口是在winsock层实现的,还是在驱动层实现的甚至是在spi层实现的,具体是怎么样的,有人知道吗?
    TDI(驱动层)实现Winsock层,只是一个抽象的接口层,真正设计“包解析”“包操作”“IO方法”“协议栈”等等等等,都是由驱动层完成,而且各个网络协议的协议栈,本来就是在驱动层实现的。详细的,看DDK资料。
      

  3.   

    把windows的网络系统看成一个层次行的系统winsock就会对应到一个层,这个说法不太准确
    我只是借助分层的思想来说明一下
    想说明不同的层次之间实现的功能是不能的,体现出一种分层结构
    不同的层次实现的功能是不一样的
      

  4.   

    感谢上面的网友的解答,也就是说如果在winsock层至TDI上截获的数据就是应用程序发送的数据在这个两个层次之间系统有没有对发送数据做过什么。
      

  5.   

    如果在winsock层至TDI上截获的数据(就是应用程序发送的数据),在这个两个层次之间系统有没有对发送数据做过什么是的。
    如果需要做点什么的话(比如,把数据加密),就需要自己在Winsock和TDI层进行处理了。Winsock用SPI,TDI就要写“过滤器型(Filter)驱动程序”。TCP协议栈的实现确实是在TDI层,当TCP包到达WINSOCK层时,系统的确是什么都没有做。所以,我一直就认为WINSOCK只是抽象的接口。它只是封装,并暴露简单而且方便使用的接口,使普通的网络开发人员能更好地使用各种网络协议,而不必涉及底层驱动和网络协议栈。当然,也不能绝对地是“WINSOCK什么都没有做”,一些不是最核心的东西,它还是牵涉了的。但就“网络数据”这块来说,它确实什么都没有做。唯一就是:TCP包在到达WINSOCK层时,TCP头在TDI层被“剥”掉了,只把一块“赤裸裸”的数据交给WINSOCK(即WIN32应用程序层)。
      

  6.   

    这里我想到了一点,winsock至少要区分出数据是递交给那一个线程的,我想这应该是winsock
    的一个功能,但是winsock也可以直接构造IP数据包的,这又是怎么回事了
    往楼上的高人能解答一下
    谢谢
      

  7.   

    winsock至少要区分出数据是递交给那一个线程的,我想这应该是winsock的一个功能对,这确实是一个。但是,就Windows下的TCP协议来说,SOCKET却不是基于线程的,而是基于进程的。这就是说,你在一个进程中创建的SOCKET,可以被该进程中任何线程访问(只要你的代码符合语法,呵呵)。在一个IP包头有一个字段是记录该包的“进程序列号”的,那么,IP/TCP协议栈会根据该字段标记的进程ID值,把该包交给相应的Win32进程。这个原理,看起来就像是“SOCKET是属于进程的”,也证明了“SOCKET不是内核对象”(呵呵,扯远了)。
    总结:把数据分发给哪一个进程,还是在TDI(协议层)完成的
    但是winsock也可以直接构造IP数据包的,这又是怎么回事了“直接构造IP数据包”,就是使用“原始(Raw-socket)套接字”。不错,这个东西看来像是Winsock的(因为它能够在Winsock里使用),但是实际上,它的实现,却是依靠调用内核态的函数(TDI)来实现的,只不过有时侯给人的感觉是“可以在Winsock下使用”。这也就是说,只要你功力足够,你完全可以不使用WINSOCK来发送-接受网络数据(若有兴趣,可参看DDK的帮助文档)。目前,一些很牛的木马就是这样来饶过Winsock层的防火墙的。总结:还是那个意思,Winsock并没有实现“任何TCP协议栈来实现的东西”,它不会越俎代庖的。:)