FastSocket学习笔记~制定自已的传输协议

对于TCP或者UDP来说,它们作于传输层的协议,有着自己的标准,或者叫格式,在我们看TCP格式之前先了解一下计算机的基础知识,字节,它是计算机世界的一个小单位,也是我们可以理会到的,如一个utf-8英文字母表示一个字节(byte),而一个汉字或者一个unicode的英文字母则表示为两个字节,或者说在计算机中它将占两个字节的存储空间。而在编程世界里,通常所说的Int32,Int16,Int64这些是类型的后缀是指它占用的位数(bit,8bit=1byte),即一个int32类型的数字,占用4个字节的存储空间,其实这在之前的教课书上大家都见过,也都背过,但可能就是没有用过,学以不至用,不是一件好事,下面就让大家学以至用一下。

TCP协议格式

aaarticlea/png;base64,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" alt="" />

TCP各字段的含义

Source Port & Destination Port
如果我们将IP比喻成地址那麽Port可以说是门口了试想一下一座大楼有前门後门侧门送货的门出货的门倒垃圾的门扔死尸的门等等乱七八糟的门......

那麽一个IP地址也有着好多个各种功能的port而每一个port都被不同的服务倾听着就好比看门人一样。下面是一些常用port和其对应的服务有兴趣的
朋友可以在Linux的/etc/services这个档案找到它们
ftp-data 20/tcp
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp mail
www 80/tcp http # WorldWideWeb HTTP
www 80/udp # HyperText Transfer Protocol
pop-3 110/tcp # POP version 3
pop-3 110/udp
其实port号码可以随您喜欢任意指定给哪些服务使用但为了避免“找错门口”的情形出现(除非您故意想躲起来)人们将一些比较常用的服务(Well
known
services)的port号码固定下来了。但是在TCP资料传送过程中可能同时要处理一个以上的封包程式也会建立多个port来避免突。在两台主机进
行资料传送的时候来源地的port和目的地的port都必须让TCP知道才行。
Sequence Number
发送序号。当资料要从一台主机传送去另一台主机的时候发送端会为封包建立起一个初始号码然後按照所传送的位元组数依次的递增上去那麽下一个封包的序号就会使用递增之後的值来作为它的序号了。这样接收端就可以根据序号来检测资料是否接收完整了。
Acknowledgement Number
回应序号。当接收端接收到TCP封包之後通过检验确认之後然後会依照发送序号产生一个回应序号发出一个回应封包给发送端这样接收端就知道刚才的封包已经被成功接收到了。
可是如果由於网路状况或其它原因当封包的TTL值达到期限时接收端还没接收到回应序号就会重发该个被以为丢失了的封包。但如果刚好重发封包之後才接收到回应呢这时候接收端就会根据序号来判断该封包是否被重发送如果是的话很简单将之丢弃不做任何处理就是了。
Data Offset
这是用来记录标头固定长度用的,和IP封包的IHL差不多。如果options没设定的话,其长度就是20byte,用十六进位表示就是 0x14了。
Reserved
这是保留区间暂时还没被使用。
Contral Flag
控制标记。一共有六个它们分别是: Urgent data
如果URG为1,表示这是一个携有紧急资料的封包。
Acknowledgment field significant
如果ACK为1,表示此封包属于一个要回应的封包。一般都会为1。
Push function
如果PSH为1,此封包所携带的数据会直接上传给上层应用程序而无需经过TCP处理。
Reset
如果RST为1,要求重传。表示要求重新设定封包再重新传递。
Synchronize sequence number
如果SYN为1,表示要求双方进行同步沟通。
No more data for sender (Finish)
如果FIN为1,表示传送结束,然後双方发出结束回应进而正式终止一个TCP传送过程。
Window
我们都知道MS Windows是什么东西,但这里的Window却非操作系统的“视窗”哦,这里一般称为“滑动视窗(Sliding Window)”。为什么我们需要使用视窗呢?
正如您刚才看到的TCP封包会通过SQN和ACK序号来确保传送的正确性,但如果每一个封包都要等上一个封包的回应才被发送出去的话实在是太慢和难以接受
的。这样我们可以利用Sliding Window在传送两端划分出一个范围,规定出可以一次性发送的最大封包数目。
当TCP传送建立起来之後两端都会将window的设定值还原到初始值比方说每次传送3个封包。然后发送端就一次发送三个封包出去,然后视窗则会往後移动
三个封包填补发送出去之封包的空缺。如果接收端够顺利也能一次处理接收下来的三个封包的话,就会告诉发送端的window值为3,但如果接收端太忙或是其
它因素影响暂时只能处理两个封包,那么在视窗里面就剩下一个封包,然后就会告诉发送端window值为2。这个时候发送端就只送出两个封包而视窗就会往後
移动两个封包填补发送出去的空缺。您明白为什麽这个视窗会“滑动”了吧。
其实,Window值是以字节数计算的。
Chechsum
当资料要传送出去的时候发送端会计算好封包资料大小然後得出这个检验值封包一起发送当接收端收到封包之後会再对资料大小进行计算看看是否和检验值一致如果结果不相称则被视为残缺封包会要求对方重发该个封包。
Urgent Pointer
还记得刚才讲到Control Flag的时候我们提到一个URG的标记吗如果URG被设定为一的时候这里就会指示出紧急资料所在位置。不过这种情形非常少见例如当资料流量超出频宽的时候系统要求网路主机暂缓发送资料所有主机收到这样的信息都需要优先处理。
Option
这个选项也比较少用。当那些需要使用同步动作的程式如Telnet要处理好终端的交互模式就会使用到option来指定资料封包的大小因为telnet使用的资料封包都很少但又需要即时回应。
Option的长度为0,或32bit的整倍数,如果不足则填充到满。

自己动手,搞自己的协议格式

[bodyLength int32][id int32][type int16][name char(20)][body byte[]]

下面我们来测试一个协议,为它赋值,模拟一下client和server的发送与接受的过程

            string name = "zzl";
var message = SerializeHelper.SerializeToBinary(new UserDTO { ID = , Name = "repositoryUncle" });
int bodyLength = + + + name.Length + message.Length;
byte[] buffer = new byte[bodyLength];
byte[] body = new byte[bodyLength]; #region (发送端)写入字节流
//write message length
Buffer.BlockCopy(BitConverter.GetBytes(bodyLength), , buffer, , );
//write id.
Buffer.BlockCopy(BitConverter.GetBytes(), , buffer, , );
//write response type.
Buffer.BlockCopy(BitConverter.GetBytes((short)), , buffer, , );
//write response name.
Buffer.BlockCopy(Encoding.ASCII.GetBytes(name), , buffer, , name.Length);
//write response message.
Buffer.BlockCopy(message, , buffer, + name.Length, message.Length); #endregion #region (接收端)读字节流
var messageLength = BitConverter.ToInt32(buffer, );
var id = BitConverter.ToInt32(buffer, );
var type = BitConverter.ToInt16(buffer, );
var nameVal = Encoding.ASCII.GetString(buffer, , name.Length);
var dataLength = messageLength - - name.Length;
Buffer.BlockCopy(buffer, + name.Length, body, , dataLength);
var obj = (UserDTO)SerializeHelper.DeserializeFromBinary(body);
#endregion

我们在测试时,可以设置断点去观察一下messageLength,id,type,nameVal,obj等元素的值,是否正确解析了,呵呵。

aaarticlea/png;base64,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RfuGAAIAqHC3b3evvz6yccxaYEvN3brV3bFjXr+9AIoXQOlFzUzQAAAl7kMPOZs3x7fPMYD6/b594YXuI4/M8Q0YrWABBABA/uxPfUo89hUx3wDy33xTviMbmRBAAACM4952m3vVVYnfmm8A9ft995vfdFkoQ8mkAVQFAGBZ+vdSactFF837XSS7/MIL/3DAAfN+F0biDBAAAKkS730OVOd9BqjP3dCqCCAAAFI5K1aM+a4OAeQ7jr3//vN+F+YhgAAASOb+8IfOtdeOeYEOAdTv991rrnHvvHPe78IwugdQxukQpcfg5bmmgmXBeAweADAx56yzvIcfHvOCWAAFx56ZHmu8Bx90zjlnhr+wCPQNIJE+5Xqz3em2O91yvZllLbDorOMJLwAAYKzx17/6sQBKWfhiyXEVTIGOASSnj2X1LKsnAijLavAEEABgKt5DDzkbNox/TTW2FMbgGDPjAur3nTPO8B59dIa/0Hg6BpAIHfncj7ww6thdIwEUX2qFAAIATMS98kp39+7xrwkHkLz65FTLnSpwd+1yr756dr/PfPoGUNoYu2tC37RqJelaLAEEAJiIc9pp3quvjn9NLIDkw81MA8h7+WV77drZ/T7zFT+AYklOAAEAFjHhXTX6nAHqT3DHEmQmBVC2m6BDGwkgAEAG/ptv2kccsejLYvcADQ83M78HqN/v25/8pP+v/zrb32kwHQNI3ASdMX2EhL5pVOS7gAggAMDi/Geftb/whUVfpslTYIK9erX//PMz/qXm0jGAhIwzAAlB30izAIXOQRJAAIDFeY884px55qIvS50HaNaXv/r9ft9Zv9577LGZ/1pT6RtAShbtGwIIALA47957nQlmedZkJmjB+drXvB//eN7vwhjFC6D08GYmaADAZNybb3bHLoIhaBVA7rXXujffPO93YYyCBRAAADkggAqPAAIAIMr78Y+dr31t0ZdpFUBcAstk0gCqAgCwbOw4/fRnjzhi3u8im+cOP/ym9evn/S6MwRkgAACi1B6Dny8eg8+EAAIAIMp/6y378MMXfZleAcREiFkQQAAARCkthTFnLIWRie4BlHE6xPBj8IPn3ocbeAweADAxu1LxXnll/GtiARRMwzvrY4330kvOunWz/Z1m0zeARPqU6812p9vudMv1Zra1wFq1UsKEQEyECACYiHvVVe7u3eNfU9VmKQx3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" alt="" />

最后一点要记住,协议并不难,字节流也并不神秘,关键在于坚持,不断的去探索、研究,有了这几点,再麻烦的事赞也能搞定!

上一篇:sql server数据库将excel表中的数据导入数据表


下一篇:FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议