发布时间:2013-01-18 19:31:32
前面一篇文章分析了套接字缓冲区sk_buff的创建过程,但一般来讲,一个套接字缓冲区总是属于一个套接字,所以,除了调用sk_buff本身的 alloc_skb函数创建一个套接字缓冲区,套接字本身还要对sk_buff进行一些操作,以及设置自身的一些成员值。下面我们来分析这个过程。 如果检查到待发送数据报没有传输层协议头(不是传输层的tcp或udp数据报),套接字创建缓冲区的函数是sock_alloc_send_skb,它的函数原型是: struct sk_buff *sock_alloc_se......【阅读全文】
发布时间:2013-01-18 19:31:29
结构体struct sk_buff中共有三个联合体,分别是h, nh和mac,它们都是一些指针,指向协议栈各层协议的首部。从含有的首部类型来看,nh是h的子集,而mac是nh的子集。《Linux设备驱动程序》 第三版第522页这样介绍这三个联合体:h中包含有传输层的报文头,nh中包含有网络层的报文头,而mac中包含的是链路层的报文头。 光靠这样的一个解释可能过于抽象,让我们来看一个UDP数据报是怎么样穿过数千公里长的网线来到我们的网卡,通过网卡的驱动程序层层向上来到协议栈的上层的。  ......【阅读全文】
发布时间:2013-01-18 19:31:25
UDP是一个简单的面向数据报的传输层协议,我们先站在UDP客户端的角度来看看如何发送一个UDP数据报,以及协议栈为发送一个UDP数据报做了哪些事情。 UDP数据报可以在未连接的socket上发送(使用sendto系统调用,指定目的地址),也可以在已连接的socket上发送(使用send系统调用,不用指定目的地址),下面我们分两种情况讨论。 下面是一个在未连接的socket上发送UDP数据的用户态程序示例(注:该程序的格式和风格相当不好,只是为临时测试使用。),该程序目前还只管发送,不处理接收,关于接收,我们后......【阅读全文】
发布时间:2013-01-18 19:31:22
很多介绍网络编程的书籍中会这样介绍connect系统调用:将本机的一个指定的套接字连接到一个指定地址的服务器套接字上去。下面是connect系统调用的定义: int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); 参数sockfd是本地机器上的一个套接字描述符,在内核的系统调用函数中该描述符会被转换成与之绑定的一个struct socket结构,这是真正的一个socke......【阅读全文】
发布时间:2013-01-18 19:31:19
标题看起来有点别扭,但的确如此,在我们前面的例子中,我们并没有在对端主机172.16.48.1的16000端口上创建一个UDP套接字(简单地讲就 是没有开启UDP服务器),所以,我们不能期望向这个目的地址发送一个UDP数据报后会收到一个相应的UDP回应。但是,这并不表示我们发出去的数据报石 沉大海,对端主机的TCP/IP协议栈在检查了16000的端口并没有相应的进程需要接收UDP数据后,会回应一个ICMP包,告诉发送端,目的地址不可 达,具体原因是目的端口不可达。下面是在网络中截获的这个ICMP包: 16进制表示的数据包内容 ......【阅读全文】