TCP程序设计系列(一)
13 Comments 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 Comments 发表评论
支持楼主大侠,好厉害啊,呵呵!!!
更新很快,辛苦了。密切关注!!
一定紧跟楼主!
雕虫小技而已
老大,继续更新啊,巴巴的盼着呢
真的么?
我也盼着,老大快写这部分吧
fork!
三个月过去啦,期待更新。
busy,sorry.
好久灭见到大神 的真迹了,膜拜
还不更新?
楼主后续几篇博客呢?能更新下吗?您是个很有思想的程序员!
发表评论
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 for comments on this post.