TCP程序设计系列(一)

13条评论 2013-08-12 admin

很多Delphi的使用者依赖控件,比如说,Indy系列。也有很多使用Winsock API的,但是或多或少都有着一些小问题,这是因为对Winsock不了解造成的。

笔者几年前曾经设计过一个完整的TCP协议栈,其中协议栈是纯粹用Delphi写的,驱动部分则是用C挂接到网卡驱动前,鉴于最近“Carberp 木马源码”已经公开,所以打算提提这方面的东西。

我们的讲座将以WinpCap作为底层收发数据部分,应用层则使用Delphi。例如,我们熟悉的两个WinSock函数:

function htons(hostshort: Word): Word;
begin
Result := ((hostshort and $FF00) shr 8) or ((hostshort and $00FF) shl 8);
end;

function htonl(hostlong: Cardinal): Cardinal;
begin
Result := ((hostlong and $FF000000) shr 24) or
((hostlong and $00FF0000) shr 8) or
((hostlong and $0000FF00) shl 8) or
((hostlong and $000000FF) shl 24);
end;

其实,TCP协议因为是基于非可靠传输的IP层协议之上的,所以可靠传输是其核心。而可靠传输的核心则是阻塞控制,简单一点说,阻塞控制的意思就是什么时候应该发送多大的数据包。

假如说,一条马路允许30台汽车同时并排通过,现在上面已经有12台了,那么你再放18台是刚好合适的。少于18台,浪费了可用的空间;多于18台,则会造成堵车,最后交通瘫痪。读者可以自己试验一下:创建一个UDP,然后往网络狂发数据,一会儿本机的QQ会掉线,IE之类无法打开,(不过UDP因为跟TCP 不同,TCP是坚持友好协议的,如果阻塞了,会暂停一段时间再启动,也称为慢启动。所以如果一个UDP程序跟TCP程序争夺带宽,TCP一会儿就败下阵来,QQ传输文件比MSN慢也是有这个原因存在)。

当然,带宽是不断变化的,如何准确判断当前的可用带宽,算法有很多,笔者阅读过Lwip、usIP和Windows XP的协议栈,发现基本上可以分为两种。这个后面再说。

先准备一台电脑,一个叫iris的抓包工具用于调试,然后开始我们的TCP之旅吧。

分类:网络相关

13条评论 发表评论

发表评论

(必填)

(必填), (Hidden)

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

TrackBack URL  |  这篇文章上的评论的RSS feed


近期文章

近期评论

文章归档

分类目录