
UNP(API)
文章平均质量分 77
ctthuangcheng
这个作者很懒,什么都没留下…
展开
-
SMTP协议学习笔记
这几天敝人并没有及时更新博客,一是由于白天工作中的锁事比较繁杂,二来连续看了两个晚上的SMTP协议。 我比较喜欢用实践来证明一切,这样才会加深自己的理解! 一、准备工作:1、本机环境:Windows XP SP3、ADSL 10M光纤2、开发工具:WildPackets OmniPeek V5.1.4 Visual C++ 6.0转载 2013-02-20 11:28:22 · 2397 阅读 · 0 评论 -
ARP协议学习笔记
一、准备工作:1、本机环境:Windows XP SP3、电信ADSL 2M家庭宽带2、开发工具:WildPackets OmniPeek V5.1.4 Visual C++ 6.0 FlexEdit V2.3.1871 二、ARP协议概念:1、ARP的数据结构[cpp]转载 2013-02-20 11:32:15 · 1394 阅读 · 0 评论 -
HTTP协议学习笔记
一、准备工作:1、本机环境:Windows XP SP3、ADSL 10M光纤2、开发工具:WildPackets OmniPeek V5.1.4 Visual C++ 6.0 IE6.0 FlexEdit V2.3.1871 二、HTTP协议概述:转载 2013-02-20 11:33:50 · 1526 阅读 · 0 评论 -
POP3协议学习笔记
今日得闲,于是将POP3的学习笔记也整理出来!互联网上的TCP/IP,POP3/SMTP等资料多如牛毛,这里只是自己一点点心得,另外对于各位网络方面的大牛请安静的路过,我可不喜欢在关公面前耍大刀... (还是那句,我比较喜欢用实践来证明一切,这样才会加深自己的理解!) 一、准备工作:1、本机环境:Windows XP SP3、公司ADSL 10M光纤2、开发工具:WildPac转载 2013-02-20 11:26:00 · 1766 阅读 · 0 评论 -
linux 内核网络,数据接收流程图
4.3 数据接收流程图各层主要函数以及位置功能说明: 1)sock_read:初始化msghdr{}的结构类型变量msg,并且将需要接收的数据存放的地址传给msg.msg_iov->iov_base. net/socket.c 2)sock_recvmsg: 调用函数指针sock->ops->recvmsg(转载 2013-02-20 10:58:13 · 1189 阅读 · 0 评论 -
linux内核网络,数据发送流程图
4.2 数据发送流程图各层主要函数以及位置功能说明: 1)sock_write:初始化msghdr{}结构 net/socket.c 2)sock_sendmsg:net/socket.c 3)inet_sendmsg:net/ipv4/af_net.c 4)tcp_sendmsg:申请sk_buff{}结构的转载 2013-02-20 10:57:16 · 1745 阅读 · 0 评论 -
网络互联设备对比
网络互联设备,转发器、集线器、网桥、交换机、路由器和网关转发器、集线器、网桥、交换机、路由器和网关都是网络互连设备。 转发器(Repeater)又被称为中继器或放大器,执行物理层协议,负责第一层(物理层)的数据中继,实现电气信号的“再生”。用于互连两个相同类型的网段,主要功能是延伸网段和改变传输媒体,从而实现信息位的转发。它本身不执行信号的过滤功能。 集线转载 2013-02-20 11:09:55 · 1895 阅读 · 0 评论 -
UNIX网络编程学习(14)--使用select正确处理EOF的str_cli函数修订版
#include "unp.h"voidstr_cli(FILE *fp,int sockfd){ int maxfdp1,stdineof; fd_set rset;// char sendline[MAXLINE],recvline[MAXLINE]; char buf[MAXLINE]; int转载 2013-02-25 08:56:06 · 2189 阅读 · 2 评论 -
Linux基本网络设置(IP配置等,网卡驱动缓存,网卡中断)
1.简单配置a.修改IP地址和掩码[html] view plaincopyprint?ifconfig eth0 192.168.0.100 netmask 255.255.255.0 b.修改网关,对于多网卡多网段的机器,需要配置一个默认网关[html] view plaincopyprint?route add def转载 2013-05-10 17:02:15 · 2505 阅读 · 0 评论 -
linux网络报文接收发送浅析
对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。网络报文的发送与之相反,进程通过系统调用将数据送入网络协议栈,或者由网络协议栈自己发起报文的发送,然后协议栈通过调用网络接口函数来调度驱动程序,使其将报文传送给网络设备,从而发送出去。本原创 2013-05-11 19:55:45 · 4066 阅读 · 0 评论 -
linux IPv4报文处理浅析
在《linux网络报文接收发送浅析》一文中介绍了数据链路层关于网络报文的处理。对于接收到的报文,如果不被丢弃、不被网桥转发,会调用netif_receive_skb()提交给IP层;而对于IP层向外发送的报文,则通过调用dev_queue_xmit()提交给数据链路层。本文就以netif_receive_skb()和dev_queue_xmit()为起始,简要介绍一下报文在IP层的原创 2013-05-12 01:10:22 · 3070 阅读 · 0 评论 -
UNIX环境高级编程——select、poll和epoll
一、selectselect目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。 select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。 另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,原创 2013-07-15 15:08:18 · 3069 阅读 · 0 评论 -
UNIX环境高级编程——网络基础概念
TCP协议分成两个不同的协议:1、网络传输中差错的传输控制协议TCP2、专门负责对不同网络进行互联的互联网协议IP网络体系结构概念:网络体系结构即是指网络的层次结构和每层所使用协议的集合OSI:(Open System Interconnect Reference Model)ISO:国际标准化组织(International Standardization Organization)TCP/IP原创 2013-07-19 13:09:21 · 1701 阅读 · 0 评论 -
UNIX环境高级编程——网络编程常用函数及结构
IP地址的转换#include int inet_aton(const char *strptr, struct in_addr *addrptr);//将strptr字符串转换成32位的网络字节序(二进制值--a.b.c.d->32)。int_addr_t inet_addr(const char *strptr)//功能通上,返回地址。in_addr a原创 2013-07-19 14:32:24 · 1775 阅读 · 0 评论 -
UNIX网络编程——网络数据包检测
网络数据包检测数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成。三种访问方式:BSD Packet Filter(BPF)SVR4 Datalink Provider Interface(DLPI)linux SOCK_PACKET interfacelibpcap库安装:apt-get install libpcap-dev常用API捕获数据包查找缺省的用来捕获数原创 2013-07-19 15:10:58 · 1425 阅读 · 0 评论 -
UNIX网络编程——TCP输出,UDP输出
TCP输出 每一个TCP套接字有一个发送缓冲区,我们可以使用SO_SNDBUF套接字选项来更改该缓冲区的大小。当某个应用进程调用write时,内核从该应用进程的缓冲区中复制所有数据到(或是应用程序的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),该应用进程将被投入睡眠。这里假设该套接字是阻塞的,他是通常的默认设置,默认键不从write系统调用返回,直到应用进程缓冲区中原创 2013-07-22 12:30:49 · 1408 阅读 · 0 评论 -
UNIX网络编程——socket概述和字节序、地址转换函数
一、什么是socketsocket可以看成是用户进程与内核网络协议栈的编程接口。socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及以后要讲的UNIX Domain Socket。然而,各种网络协议的地址格式并不相同,如下图所示:IPv4和IPv6的地址格式定义在netine转载 2013-07-22 13:29:13 · 2323 阅读 · 0 评论 -
UNIX网络编程——客户/服务器程序设计示范(五)
TCP预先派生子进程服务器程序,传递描述符 对预先派生子进程服务器程序的最后一个修改版本是只让父进程调用accept,然后把所接受的已连接套接字“传递”给某个子进程。这么做绕过了为所有子进程的accept调用提供上锁保护的可能需求,不过需要从父进程到子进程的某种形式的描述符传递。这种技术会使代码多少有点复杂,因为父进程必须跟踪子进程的忙闲状态,以便给空闲子进程传递新的套原创 2013-07-29 16:34:54 · 1261 阅读 · 0 评论 -
UNIX网络编程——客户/服务器程序设计示范(三)
TCP预先派生子进程服务器程序,accept无上锁保护 我们的第一个“增强”型服务器程序使用称为预先派生子进程的技术。使用该技术的服务器不像传统意义的并发服务器那样为每个客户现场派生一个子进程,而是启动阶段预先派生一定数量的子进程,当各个客户连接到达时,这些子进程立即就能为他们服务。下图展示了服务器父进程预先派生出N个子进程且正有2个客户连接着的情形。原创 2013-07-29 13:57:01 · 1707 阅读 · 0 评论 -
UNIX网络编程——客户/服务器程序设计示范(总结)
(1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了。这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收。我们的其他意见是就重负荷运行的服务器而言的,譬如Web服务器。 (2)相比传统的每个客户fork一次设计示范,预先创建一个子进程池或一个线程池的设计示范能够把进程控制CPU时间降低10倍或以上。编写这些示范的程序并不复杂,不过原创 2013-07-29 18:12:37 · 1578 阅读 · 0 评论 -
UNIX网络编程——常用服务器模型总结
下面有9种服务器模型分别是:迭代服务器。并发服务器,为每个客户fork一个进程。预先派生子进程,每个子进程都调用accept,accept无上锁保护。预先派生子进程,以文件锁的方式保护accept。 预先派生子进程,以线程互斥锁上锁的方式保护accept。预先派生子进程,由父进程向子进程传递套接口描述字。 并发服务器,为每个客户请求创建一个线程。预先创建线程,以互斥锁上锁方式保护accept。 预原创 2013-07-29 18:52:02 · 1938 阅读 · 0 评论 -
UNIX网络编程——使用线程的TCP回射服务器程序
同一进程内的所有线程除了共享全局变量外还共享:(1)进程指令;(2)大多数数据;(3) 打开的文件(即描述符);(4)信号处理函数和信号处置;(5)当前工作目录;(6)用户ID和组ID。不过每个线程有各自的:(1)线程ID;(2)寄存器集合,包括程序计数器和栈指针;(3)栈(用于存放局部变量和返回地址);(4)errno;(5)信号掩码;(6)优先级。原创 2013-07-29 11:07:47 · 1603 阅读 · 0 评论 -
UNIX网络编程——I/O复用:select和poll函数
我们看到TCP客户同时处理两个输入:标准输入和TCP套接字。我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死。服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然客户进程正阻塞于从标准输入读入的过程,它将看不到这个EOF,直到从套接字读时为止(可能额已过了很长时间)。这样的进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(也就原创 2013-07-23 18:59:32 · 1685 阅读 · 0 评论 -
UNIX网络编程——shutdown 与 close 函数 的区别
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出错,而s原创 2013-07-24 00:56:16 · 2367 阅读 · 0 评论 -
UNIX网络编程——僵尸进程
在fork()/exec()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会原创 2013-07-23 19:51:03 · 1360 阅读 · 0 评论 -
UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)
有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t原创 2013-07-24 12:03:14 · 8702 阅读 · 0 评论 -
UNIX网络编程——TCP 滑动窗口协议
什么是滑动窗口协议? 一图胜千言,看下面的图。简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。下面图中的4,5,6号数据帧已经被发送出去,但是未收到关联的ACK,7,8,9帧则是等待发送。可以看出发送端的窗口大小为6,这是由接受端告知的(事实上必须考转载 2013-07-24 13:59:14 · 1728 阅读 · 0 评论 -
UNIX网络编程——心跳包
所谓的心跳包就是在客户端和服务器端间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。 一般是用来判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉。用于检测TCP的异常断开。 基本原因是服务器端不能有效的判断客户端是否在线也就是说,服务器无法区分客户端是长时转载 2013-07-24 15:44:19 · 2229 阅读 · 0 评论 -
UNIX网络编程——getsockname和getpeername函数
这两个函数或者返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字关联的外地协议地址即得到对方的地址(getpeername)。#include int getsockname(int sockfd,struct sockaddr* localaddr,socklen_t *addrlen);int getpeername(int sockfd,struct so原创 2013-07-22 23:56:11 · 2715 阅读 · 0 评论 -
UNIX网络编程——TCP回射服务器/客户端程序
下面通过最简单的客户端/服务器程序的实例来学习socket API。原创 2013-07-23 08:42:38 · 2574 阅读 · 1 评论 -
UNIX网络编程——ICMP报文分析:端口不可达
ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节(包含源端口和目的端口)。在我们的例子中,跟在IP首部后面的前8个字节包含UDP的首部。 我们利用前面博客中UNIX网络编程学习(18)中UDP回射程序,不开启服务器端程序,只开启客户程序,发送出一个hello,没有回应,但是用wireshark抓包,会有:转载 2013-07-23 19:53:15 · 2482 阅读 · 0 评论 -
UNIX网络编程——处理服务器中大量的TIME_WAIT
出现条件:服务器主动关闭 短连接服务加剧 根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),TIME_WAIT状态下的socket不能被回收使用。 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致原创 2013-07-24 14:45:29 · 1670 阅读 · 0 评论 -
Wireshark基本介绍和学习TCP三次握手
这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括http,TCP,UDP,等网络协议包。记得大学的时候就学习过TCP的三次握手协议,那时候只是知道,虽然在书上看过很多TCP和UDP的资料,但是从来没有真正见过这些数据包, 老是感觉在云上飘一样,学得不踏实。有了wireshark就能截获这些网络数据包,可以清晰的看到数据包中的每一个字段。更能加深我们对网络协议的理解。转载 2013-07-30 23:52:43 · 1464 阅读 · 0 评论 -
UNIX网络编程——套接字选项(setsockopt)
setsockopt的一些用法:close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 如果要已经处于连接状态的soket在调用close socket后原创 2013-07-24 15:04:28 · 1966 阅读 · 0 评论 -
UNIX网络编程——套接字选项(SOL_SOCKET级别)
#include int setsockopt( int socket, int level, int option_name,const void *option_value, size_t option_len);第一个参数socket是套接字描述符。第二个参数level是被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为SOL_SOCKET。第三个参数 optio原创 2013-07-24 15:39:50 · 5161 阅读 · 0 评论 -
UNIX网络编程——经常使用的套接字选项
1.设置/获取套接字选项int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);int getsockopt(int socket, int level, int option_name, void *restrict option_value,原创 2013-07-24 15:53:09 · 1565 阅读 · 0 评论 -
UNIX网络编程——产生RST
产生RST的3个条件:1. 建立连接的SYN到达某端口,但是该端口上没有正在监听的服务。 如:IP为192.168.1.33的主机上并没有开启WEB服务(端口号为0x50),这时我们通过IE去访问192.168.1.33,通过Wireshark抓包,可以看到,对此SYN包的回复为RST。说明此服务器(即IP192.168.1.33)是存在的,不过其上并没有运行WEB Server(如apach原创 2013-07-25 01:54:20 · 1661 阅读 · 0 评论 -
UNIX网络编程——通用套接字选项
1. SO_BROADCAST 套接字选项 本选项开启或禁止进程发送广播消息的能力。只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上(例如以太网,令牌环网等)。我们不可能在点对点链路上进行广播,也不可能在基于连接的传输协议(例如TCP和SCTP)之上进行广播。 2. SO_DEBUG 套接字选项 本选项仅由TCP支持。当给一个TCP套接字开启本选项时,内核将为TCP在该套原创 2013-07-25 10:54:32 · 1704 阅读 · 0 评论 -
UNIX网络编程——TCP长连接与短连接的区别
一、TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊转载 2013-07-25 00:56:29 · 2507 阅读 · 0 评论 -
UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认
在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不发包)。 而SOCK_STREAM对应如下: connect会完成TCP的三次握手,客户端调用connect后,由内核中的TCP协议完成TCP的三次握手; close操转载 2013-07-25 11:32:15 · 1847 阅读 · 0 评论