LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 738|回复: 4

网络编程中几个收发信息函数所传递内容的困惑。

[复制链接]
发表于 2006-5-19 11:01:32 | 显示全部楼层 |阅读模式
小弟正在学linux下的网络编程,读了不少代码,发现越来越困惑,想在这里问一下好少走些弯路(就连问题都问得很困惑,不知道怎么问):

信息收发函数很多,比如send() sendto(),recv() recvfrom(),分别用于面向连接/非面向连接的程序。
但是这些函数到底传送了什么东西?从7层模型的角度说,不外乎各种协议的数据包,其结构应该是"包头+数据"。
而在读一个chat程序时,使用SOCK_STREAM创建套接字,send和recv的就是普通的字符串,没看见有什么去除包头的动作。
在一个Myping程序中,创建了原始套接字,用sendto发送的是自己构建的icmp包,用recvfrom收到的buf好像是个ip包,需要先去ip头,再去icmp头才是数据。

我不明白了,这些函数传送的信息的内容格式由谁决定???????????
发表于 2006-5-20 10:15:46 | 显示全部楼层
man 7 ip
man 7 socket
man 7 raw
man 7 packet
回复 支持 反对

使用道具 举报

发表于 2006-5-21 12:44:36 | 显示全部楼层
TCP/IP 应该说不是 7 层协议中的。OSI 7 层协议虽然是理论标准,但是真正的行业标准是 TCP/IP 协议族。

而我们一般所说所用的(也就是 socket 编程中除 RawSocket 以外所使用的) TCP/IP 指的是什么呢?对应于 OSI 模型,应该是传输层,由于 TCP/IP 协议族中没有表示层和会话层,所以比它再高一层的就是最顶层的应用层了。在这一层你是看不到更低层次的包封装信息的。

应用层有什么呢?一般用到的POP3,SMTP,HTTP,FTP,Telnet,DNS,SNMP,这些统统都是应用层协议。如果我们自己想写一个聊天程序,那么我们自己设计的协议一般也是应用层的。所以这时无论是接收还是发送的数据都会非常“干净”,因为应用层的协议都非常简单直白。

如果使用 Raw Socket 编程,那么这时我们自己从网络层这个高度生成包的内容。对于 PING 来说,是 ICMP 协议吧,属于网络层协议,当然就要用 Raw Socket 来实现了。
回复 支持 反对

使用道具 举报

发表于 2006-5-23 11:05:52 | 显示全部楼层
以上的发送和接收函数中的×buffer指向的都是应用层的数据,也就是说你自己封装的内容全都是交给应用层来处理,如果要得到下层的数据必须要从内核中的TCP/IP协议栈中来读取,我记得TUN的实现原理就是这样的,如果你想自己来处理ip头部,tcp、udp头部信息的话可以用TUN来试试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-25 14:34:27 | 显示全部楼层
大家好可爱呀,太谢谢了!
我要好好研究一下大家的分析。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表