TCP/UDP包与socket是独立的吗?详细看内文,急!

81 views
Skip to first unread message

lclniuniu

unread,
Dec 1, 2008, 1:17:15 AM12/1/08
to 高性能网络编程邮件列表
socket tcp的发送函数write和接收函数read都是根据socket描述符发送的。
tcp ip包头他们自动添加和去除吗?read出来的数据都是payload吗?

一般要实现一个较为实用的a<------------------>b之间的tcp连接通信需要考虑哪些东西?
分片?加密?(如果read和write自动加密只能为payload加密吧?不能把header和payload一起加密吗?),序列号保证等?

是不是一般使用的tcp通信,write和read的数据都是自己定义的包头内容(格式和标准一致)+payload

反正现在头脑挺迷糊的,大牛指点一下吧。多谢

lclniuniu

unread,
Dec 1, 2008, 1:21:02 AM12/1/08
to 高性能网络编程邮件列表
平常练手都是server和client之间数据直接read或write处理,中间没有进行任何处理是不是很业余啊?问问非常专业的做法,多谢。

李忠波

unread,
Dec 1, 2008, 1:30:12 AM12/1/08
to dev4s...@googlegroups.com
TCP头部应该不能加密吧?路由器什么的都要查看、修改头部信息。
用户数据倒是可以,不过跟协议已经无关了。

Franklin Coolfiry

unread,
Dec 1, 2008, 1:33:36 AM12/1/08
to dev4s...@googlegroups.com
建议你去找一两个协议看一看,比如:CMPP,SMPP。或者是看一下基于TCP的一些RFC协议你就明白了TCP如何进行协议传输了。
慢慢来,不要急。
另外你应该多看看大学里面网络通信的教科书,先还一些TCP/IP的通信原理有一个基本的了解。

2008/12/1 lclniuniu <kungf...@163.com>

狄卫华

unread,
Dec 1, 2008, 3:52:48 AM12/1/08
to dev4s...@googlegroups.com
你调用write和read都是用户自己写入的数据,write时候IP协议栈自动加入IP(TCP or UDP)头部,read的时候IP协议栈会自动去掉IP(TCP or UDP)头部,因此你write的数据在对端受到的时候还是你写入的数据。头部的问题对是透明的。即使IP的分片和重组也是由IP协议栈为你做的,这些你都不需要考虑,唯一考虑的就是你要发送的数据区域。
 
因为头部对你透明,所以你即使加密也只能加密你发送的数据,但是就如我下面提到的因为TCP读的时候是流读取,所以数据区自己要加入一个自己定义的报头,最简单的就是一个len,所以len是不能加密的,len后面跟的buffer是可以加密的。
 
要弄清楚UDP是数据报文,而TCP是流数据报文。
 两者区别如下:
 (1) UDP你可以用read一次读入一个包,而且返回的也就是一个包。
       比如同时到了p1p2两个报,你可以分两次read读,每次返回一个报。
 (2)而TCP是不一样的,就是流数据报文,read返回的是尽量多的数据报,可能是多个。
      比如同时到了p1p2两个报,你一次read就能把两个全读了,因此需要自己在tcp的数据区定义头部,数据 (long)len + buffer 格式, 先使用read(长度4byte)读出数据的长度len,然后再根据len,读取后面buffer的数据 read(ntohl(len)); 这样才能读取一个完整的数据报,就是通常的两次读。

[广告] 金秋最关注楼盘-房不胜房

Kouga

unread,
Dec 4, 2008, 9:27:45 PM12/4/08
to dev4s...@googlegroups.com
这样,如果你认为加密传输很重要,那么你就应该更换两边的线路连接,包括路由器在内的所有设备都要支持你的加密IP包头才行了……

不奇怪,这种情况下用UDP似乎更好点。

jrckkyy

unread,
Dec 14, 2008, 4:38:22 AM12/14/08
to dev4s...@googlegroups.com
模拟个ssl就好了

2008/12/5 Kouga <ncw...@gmail.com>

jrckkyy

unread,
Dec 14, 2008, 4:46:57 AM12/14/08
to dev4s...@googlegroups.com
基于tcp,udp的内容传输了,传输的其实就是osi中所谓的的表示层的东西。http,ftp等协议中的"上下文无关文法"也就在这里了。

2008/12/1 狄卫华 <dwh...@163.com>

杨光

unread,
Dec 21, 2008, 9:06:02 PM12/21/08
to dev4s...@googlegroups.com
TCP能保证你的数据包是循序接收的.UDP不能保证,可能发生后发先至,需要你自己定义出自己的协议.

2008/12/14 jrckkyy <jrc...@gmail.com>

Joe Simer

unread,
Dec 22, 2008, 4:59:02 AM12/22/08
to dev4s...@googlegroups.com
TCP传送是带校验的,客户机接受到以后会传回校验码(此处牵涉到"滑动窗口协议"),如果出错TCP的实现程序会重新发送此包。
UDP是不带校验的,把包传到网络上就不管了,目的地址是否收到,数据包在传送过程中是否出现错误都不管了。

你说的socket不知道是哪个版本,目前应用比较广泛的socket都是以巴克利socket为基础实现的。windows系统下一般使用winsock,也是以巴克利socket为基础实现的,但是和标准版相比有较大变化。

如果使用socket进行通信,不必自己定义包头什么的。
著名的syn攻击就是修改ip包头,将本应该存放发送机ip地址的地方修改成一个虚构的地址,导致服务器不断的去和一个不存在的地址联系。服务器进行很多这种连接的时候,网络资源耗尽。

要想彻底弄清楚推荐楼主看2本(套)书,
《高级计算机网络》美国人写的,好像是清华翻译和出版的
《TCP/IP协议详解》美国人写的,好像是南京哪个大学翻译的,那些译者都是穿军装的人
都是研究生教材,呵呵。

2008/12/1 lclniuniu <kungf...@163.com>
Reply all
Reply to author
Forward
0 new messages