LinqiangHe
男, 30岁
浙江 杭州
上次登录: 5天前
加为好友
|
|
2007年06月11日 星期一 上午 09:10
自今年年初起,由于一些个人原因,本博客暂停更新,目前还有UDP版、TCP版未发布,在一段时间后,会补充完整。具体时间未定。
如果现有的内容能够对你的工作,学习有所帮助,我会感到非常高兴。但由于技术的东西本身具有特殊性,我目前在暂时不关注这一块的情况下,很难一下子跟您进行深入的探讨,所以,所有关于技术咨询的来信,恕不回复,还望谅解。 |
2007年04月19日 星期四 下午 02:27
在Socket编程中,发送数据报文可供使用的API函数有send,sendto和sendmsg,下面是关于前两个系统调用的原型:
#include <sys/socket.h>
ssize_t send( int socket, const void *buffer, size_t length, int flags );
请注意它的返回值的类型ssize_t,其含义是signed size。从内核代码中,我们可以看到,在32位系统上,它是int,在64位系统上,它是long。它常用于表示在某一次操作后,缓冲区中可以被读或写的字节数量。相对应的,还有一个数据类型size_t |
2007年04月17日 星期二 下午 06:38
下面是connect系统调用的函数原型:
#include <sys/types.h>
#include <sys/socket.h>
int connect( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen );
man手册里面这样描述该系统调用:connect()系统调用把由文件描述符sockfd所代表的套接字连接到serv_addr所指定的地址上,参数addrlen用于标明serv_addr的大小。如果sockfd是SOCK_DGRAM类型的套接字 |
2007年03月14日 星期三 上午 08:22
当建立一个UDP的socket用于网络通讯时,我们需要先为这个socket绑定一个本地端口号。因为端口在一台主机上是用于标识进程的,如果没有端口号,当收到来自对端主机的报文时,就不知道应该由哪一个进程来接收这个报文。但有时,我们建立UDP的sokcet以后,并不调用bind进行端口绑定,也能正常工作。这是因为协议栈对于没有进行端口绑定的socket进行了自动绑定。
在SOCK_DGRAM类型的套接字的操作函数集的sendmsg成员函数中,每次调用对 |
2007年03月07日 星期三 上午 07:50
首先以socket和send两个系统调用为例,来回顾一下协议栈是如何工作的,在这过程中可以找到如何在协议栈中增加对UDP协议的支持。socket系统调用的原型是
int socket(int domain, int type, int protocol);
domain是协议域,对于ipv4协议来说,其值是PF_INET(ipv4因特网协议),对于我们自己实现的ipv4协议模块,我们为其新增MY_PF_INET。所有的协议域在include/linux/socket.h被定义,如下:
# |
2007年01月06日 星期六 下午 05:42
基本实现到网络层为止的所有功能,距上一版本后,主要增加对原始套接字(SOCK_RAW)的支持,IGMP和多播功能的支持,FIB也已经基本补充完整。还缺少一些不常用的功能,在后续的实现传输层协议的过程中,会根据需要加上。
点击跳转到下载页面 |
2007年01月03日 星期三 下午 10:37
应用程序通过命令字IP_DROP_MEMBERSHIP使一个socket离开一个多播组,IP_DROP_MEMBERSHIP是一个IP层的命令字,其调用使用的参数是结构体struct ip_mreq。该结构体的两个成员分别用于指定所要离开的多播组的组IP地址,和所要离开组的那个本地接口的IP地址。
ip_setsockopt实现了该命令字,它通过调用ip_mc_leave_group使socket离开一个多播组。
表示INET域socket的结构体struct inet_sock的成员mc_list是该socket所加入的所有多播组的一个链表,ip_mc_leave_group从该 |
2006年12月31日 星期日 下午 06:10
跌跌撞撞把TCP/IP协议栈的实现搞了一年,其间得到了很多朋友的帮助和支持,在这里衷心地感谢大家。12月由于家里有些事情,以至于未能在月底如期完成IP完整版,目前还差IGMP有部分未完成,看来只能等2007年了。
希望在新的一年里,我们能一如既往的互相帮助,互相支持,共同提高,谢谢大家。 |
2006年12月31日 星期日 下午 03:41
应用程序通过命令字IP_ADD_MEMBERSHIP把一个socket加入到一个多播组,IP_ADD_MEMBERSHIP是一个IP层的命令字,其调用使用的参数是结构体struct ip_mreq,其定义如下:
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
该结构体的两个成员分别用于指定所加入的多播组的组IP地址,和 |
2006年12月21日 星期四 下午 06:38
5、组成员协议的描述
IGMP是一个非对称的协议,分别指定组成员(即那些希望接收多播数据报的主机和路由器)和多播路由器的行为。本节主要描述IGMPv3运用于所有组成员 的那部分(需要注意的是,一个同时是组成员的多播路由器会同时执行IGMPv3的两部分,对来自自己的和邻居的IGMP消息,它都会接收和报告。 IGMPv3的多播路由器部分在第6节描述)。
一个系统在所有支持多播接收的接口上执行本节所描述的协议,即使有多个接口连接在同一网络上也是如此。
为了能跟运行旧版 |
2006年12月21日 星期四 下午 06:37
备忘录状态
略
摘要
本文档说明了因特网组管理协议的第3版,IGMPv3。IGMP协议被IPv4系统用于向邻接的多播路由器报告它们的组成员关系。第3版的IGMP增加了对“源过滤”的支持,即系统能够报告它只对接收到的发往某一特定多播组的数据报中,某些来自特定源地址的数据感兴趣,或者是只对除了某些特定源地址之外的数据感兴趣。这个信息能够被多播路由协议用于避免把某些来自特定源地址的多播数据报发往对它不感兴趣的网络。
1、简介
IGMP协议 |
2006年12月18日 星期一 下午 12:51
1、定义
略
2、简介
因特网组管理协议(IGMP)被IP主机用于向所有的直接相邻的多播路由器报告它们的多播组成员关系。本文档只描述在主机和路由器之间的确定组成员关系的IGMP应用。作为多播组成员的路由器应当还能表现为一台主机,甚至能对自己的查询作出响应。IGMP还可以应用在路由器之间,但这种应用不在这里描述。
就像ICMP一样,IGMP作为整合在IP里面的一部分。所有希望接收IP组播的主机都 |
2006年12月16日 星期六 上午 11:38
1、备忘录状态
略
2、简介
IP多播是用于把一个IP数据报传送给一个由多个主机组成的“组”,传送中,使用一个目的IP地址来标识由0个或多个主机组成的组。就像单播的IP数据一样,一个多播IP数据报被尽可能可靠地传送到它的目的组中的每一台主机。也就是说,数据报是不保证能够完整地到达目的组中的每一台主机,也不能保证跟其它数据报之间不会乱序。
多播组的成员是动态的,也就是说,任何时候,任何一个成员都 |
2006年12月12日 星期二 下午 06:45
IP选项中目前还比较有用的就是源站选路选项(IPOPT_SSRR和IPOPT_LSRR),和记录路由选项(IPOPT_RR),ping程序的-R命令选项可以启用IPOPT_RR选项,以提供记录路由的功能。通过-R发送出去的回显请求包带有IPOPT_RR选项,共40字节,除去code, len, ptr三字节,另外发送数据报的源端也把自己的出口IP地址填入选项的IP清单中,这样,还有8个IP地址的空间可用,所以,用ping程序来确定数据报的路由,其功能是非常有限的。
当网络中的一台主机收到带有RR选项的回显请求包后,其网络层的接收函数ip_rcv |
2006年12月12日 星期二 上午 07:44
构建完成的IP选项(通过setsockopt系统调用,使用IP_OPTIONS命令),存放在套接字结构体struct inet_sock的成员opt中,在随后的数据报发送过程中,会根据opt的指示把相关的IP选项加到IP首部中,下面以一个原始套接字上的数据报发送为例,详细分析整个过程。
raw_sendmsg定义了一个局部变量struct ipcm_cookie ipc,其定义如下:
struct ipcm_cookie
{
u32 |
|