
UNPv1
勇敢地追
这个作者很懒,什么都没留下…
展开
-
UNPv1第二章:传输层
本章的焦点是传输层,包括TCP和UDP。 绝大多数客户/服务器网络应用使用TCP或UDP。 UDP是一个简单的、不可靠的数据报协议。而TCP是一个复杂、可靠的字节流协议。1 UDP用户数据报协议UDP是一个简单的传输层协议。应用程序往UDP套接字写入一个消息,该消息随后被封装成IPv4或者IPv6数据报。 UDP不保证数据报会达到最终目的地,不保证各个数据报的先后顺序跨网路后保持不变,也不保证原创 2016-04-25 17:16:09 · 345 阅读 · 0 评论 -
UNPv1第十八章:广播
1.广播地址如果用{netid, subnetid, hostid}( {网络ID,子网ID,主机ID})表示IPv4地址。那么有四种类型的广播地址,我们用-1表示所有比特位均为1的字段: 1). 子网广播地址:{netid, subnetid, -1}。这类地址编排指定子网上的所有接口。 2). 全部子网广播地址:{netid, -1, -1}。这类广播地址编排指定网络上的所有子网。 3).转载 2016-04-26 13:25:58 · 345 阅读 · 0 评论 -
UNPv1第十九章:多播
单播地址标识单个接口,广播地址标识所有接口,多播地址标识一组接口。多播数据报仅对感兴趣的接口接收。单播、广播、组播的区别小结(源自http://www.cnblogs.com/Ewin/archive/2008/11/25/1340752.html)1.单播:主机之间一对一的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相原创 2016-04-26 13:35:48 · 503 阅读 · 0 评论 -
UNPv1第二十章:高级UDP套接口编程
1.接收标志、目的IP地址和接口索引作为recvmsg的一个例子,我们将要写一个名为recvfrom_flags的函数,它与recvfrom类似,但他还返回:返回的msg_flags值 收到的数据报的目的地址(通过设置IP_RECVDSTADDR套接口选项)接收数据报接口的索引(通过设置IP_RECIF套接口选项)为了返回最后两项,我们定义如下结构:struct in_pktinfo{原创 2016-04-26 13:45:34 · 716 阅读 · 0 评论 -
UNPv1第二十一章:带外数据
1.概述带外数据被认为具有比普遍数据更高的优先级。带外数据并不要求在客户和服务器之间在使用一个连接,而是被映射到已有的连接中2.TCP带外数据TCP没有真正的带外数据,而是提供了一个我们要讨论的紧急模式(urgent mode)。假设一个进程已向一个TCP套接口写入了N字节数据,并且这些数据被TCP放入套接口发送缓冲区等待发送给对方。下图展示了这种状态,并且标记了从1到N的数据字节。 进程现在转载 2016-04-26 13:54:20 · 337 阅读 · 0 评论 -
UNPv1第二十二章:信号驱动IO
1.概述信号驱动是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程。需要注意的是这里描述的信号驱动不是真正的异步I/O。 注意第16章描述的非阻塞I/O同样不是异步I/O。对于非阻塞I/O,内核一旦启动,I/O操作就不像异步I/O那样立即返回到进程,而是等到I/O操作完成或遇到错误;内核立即返回的唯一条件是I/O操作的完成不得不把进程投入睡眠,这种情况下内核不启动I/O操原创 2016-04-26 13:58:09 · 438 阅读 · 0 评论 -
UNPv1第二十三章:线程
在传统的UNIX模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。UNIX下的大多数网络服务器程序都是这么编写的,这在我们的并发服务程序例子中可以看出:父进程接收连接,派生子进程,子进程处理与客户的交互。虽然这种模式很多年来使用的很好,但是fork有一些问题:fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要在子进程中复制等等。目前的原创 2016-04-26 14:17:42 · 350 阅读 · 0 评论 -
UNPv1第二十五章:原始套接口
1. 概述原始套接口提供以下三种TCP及UDP套接口一般不提供的功能。 1. 使用原始套接口可以读写ICMPv4,IGMPv4,ICMPv6分组。例如:Ping程序,就使用原始套接口发送ICMP回射请求,并接受ICMP回射应答。 2. 使用原始套接口可以读写特殊的IPv4数据报,内核不处理这些数据报的IPv4协议字段。 3. 利用原始套接口,好似用IP_HDRINCL套接口选项可以构造自己的I原创 2016-04-26 14:31:38 · 831 阅读 · 0 评论 -
UNPv1第二十六章:数据链路访问
1. 概述目前大多数操作系统都为应用程序提供了访问数据链路层的手段,它使得应用程序拥有如下功能:监视数据链路层上的所收到的分组,这使得我们可以在普通计算机系统上通过tcpdump来检测网络,而无需使用特殊的硬件设备作为普通应用进程而不是内核的一部分运行某些程序Unix上三种最常用的数据链路访问方法BSD的BSD分组过滤器BPFSVR4的数据链路提供者接口DLPI Linux的SOCK_P原创 2016-04-26 14:38:30 · 402 阅读 · 0 评论 -
利用套接字进行数据传输
服务器端的步骤如下:1. socket: 建立一个socket2. bind: 将这个socket绑定在某个文件上(AF_UNIX)或某个端口上(AF_INET),我们会分别介绍这两种。3. listen: 开始监听4. accept: 如果监听到客户端连接,则调用accept接收这个连接并同时新建一个socket来和客户进行通信5. re原创 2016-04-27 08:36:40 · 1347 阅读 · 0 评论 -
UNPv1第十五章:非阻塞IO
1.阻塞的套接口调用可分为以下四种:1).输入操作: read, readv, recv, recvfrom和recvmsg函数。 2).输出操作: write, writev, send, sendto和sendmsg函数。 3).接收外来连接: accept函数 4).初始化外出的连接: 用于TCP的connect函数2.非阻塞读和写我们维护两个缓冲区: to容纳从标准输入到服务器去的数据原创 2016-04-26 11:56:20 · 785 阅读 · 0 评论 -
UNPv1第十四章:Unix域协议
Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API(套接口或XTI)的一种方法。 当客户和服务器在同一台主机上时,Unix域协议是IPC通信方式的一种替代品。 Unix域提供了两种类型的套接口:字节流套接口(与TCP类似)和数据报套接口(与UDP类似)。1.Unix域套接口地址结构struct sockaddr_原创 2016-04-26 11:45:56 · 310 阅读 · 0 评论 -
UNPv1第十三章:高级IO
1.套接字超时涉及套接字上的I/O操作设置超时的方法有三种方法:调用alarm,在到达指定时间时产生SIGALRM信号使用select阻塞在等待I/O上,select内部有一个时间限制,以此代替在read或write调用上阻塞使用新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项前两种技术可以用于任何描述字,而第三种只能用于套接口描述字。2.recv和send函数这两个函数和标准的原创 2016-04-26 11:31:24 · 410 阅读 · 0 评论 -
UNPv1第三章:套接字编程简介
1.套接字地址结构1).IPv4套接字地址结构 IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在struct in_addr{ in_addr_t s_addr; //32位的IPv4网络字节序}struct sockaddr_in{ uint8_t sin_len;原创 2016-04-25 19:18:07 · 891 阅读 · 0 评论 -
UNPv1第四章:基本TCP套接口编程
1 socket函数为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型#include <sys/socket.h>int socket (int family, int type, int protocol);//返回:若成功则为非负描述符,若出错则为-1其中family指明协议族,type参数指明套接字类型,protocol参数应该设为某个(见下图)原创 2016-04-26 09:21:19 · 1668 阅读 · 0 评论 -
UNPv1第五章:TCP客户服务器程序实例
现在写一个完整的TCP客户-服务器程序例子这个简单的例子是完成下述功能的一个回射服务器: 1. 客户从标准输入读一行文本,写到服务器上 2. 服务器读入此行,并回射给客户 3. 客户读此回射行写到标准输出 客户端代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>原创 2016-04-26 09:42:44 · 523 阅读 · 0 评论 -
UNPv1第六章:IO复用select&poll
有些进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(也就是说输入已准备好被读取,或者描述符已能承受更多的输出),他就通知进程,这个能力称为I/O复用1.IO模型5种基本I/O模型阻塞式I/O非阻塞式I/OI/O复用(select和poll)信号驱动式I/O(SIGIO)异步I/O一个输入操作通常包括两个不同的阶段 (1)等待数据准备 (2)从内核向进程原创 2016-04-26 09:58:22 · 1342 阅读 · 0 评论 -
UNPv1第七章:套接口选项
1 getsockopt和setsockopt函数这两个函数仅用于套接字:#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname, cons原创 2016-04-26 10:02:18 · 474 阅读 · 0 评论 -
UNPv1第八章:基本UDP套接口编程
使用UDP编写的一些常用应用程序有:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)1.典型的UDP客户/服务器程序的函数调用:2.recvfrom和sendto函数两个函数类似于标准的read和write函数,不过需要三个额外的参数#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t原创 2016-04-26 10:25:24 · 549 阅读 · 0 评论 -
UNPv1第九章:基本名字与地址转换
1.gethostbyname查找主机名最基本的函数是gethostbyname,如果成功,它返回一个指向结构hostent的指针,该结构中包含了该主机的所有IPv4或IPv6地址#include<netdb.h>struct hostent *gethostbyname(const char *hostname);hostent结构如下:struct hostent{ char *h_n原创 2016-04-26 10:31:25 · 478 阅读 · 0 评论 -
UNPv1第十一章:高级名字与地址转换
1.getaddrinfogetaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个sockaddr结构而不是一个地址列表,这些sockaddr结构随后可由套接字函数直接使用#include <netdb.h>int getaddrinfo (const char *hostname, const char *service, const struct addrinfo *转载 2016-04-26 10:40:18 · 359 阅读 · 0 评论 -
UNPv1第十二章:守护进程
守护进程(daemon)是在后台运行不受终端控制的进程。Unix系统中一般有很多守护进程在后台运行(20到50个),执行不同的管理任务1.syslog函数既然守护进程没有控制终端,它们就不能把消息fprintf到stderr上,从守护进程中登记消息的常用技巧就是调用syslog函数#include <syslog.h>void syslog(int priority, const char *me转载 2016-04-26 10:50:00 · 313 阅读 · 0 评论 -
UNPv1第十七章:路由套接口
1.概述在路由器接口中支持三种类型的操作 1). 进程能通过写路由套接口向内核发消息。 2). 进程能在路由套接口上从内核读消息,这是核心通知进程已收到一个ICMP重定向消息并进行了处理的方式。 3). 进程可以用sysctl函数得到路由表或列出所有已配置的接口。2.数据链路套接口地址结构在路由套接口上返回的一些消息中包含数据链路套接口地址结构,他在struct sockaddr_dl {原创 2016-04-26 13:19:49 · 511 阅读 · 0 评论