Router,Switch
ISP:Internet Service Protocol
TCP(Transfer Control Protocol)
IP:Internet Protocol
MAC:Medial Access Control
在广播通信中,网络层提供了将封包从一个节点发送到所有其他节点的服务;多播可以是一个源节点发送封包的拷贝到其他多个网络节点的集合
终端系统由通信链接连在一起。常见的通信链接有双绞线,同轴电缆,光纤等,它们负责传输原始的比特流。
中介设备称为包交换器,包交换器在通信链路上接受到达的信息块,并向其它的通信链路推进这个信息块。这些信息块称为包(packet)。最基本的包交换器是路由器(router),和链路层交换器(link-layer switch)。
许多政府和公司的专用网络称为企业内部互联网。
协议是指通信双方进行通信的一种约定。各层和各层协议的集合称为网络体系。特定系统所使用的一组协议称为协议堆栈。
地址 | 用途 |
224.0.0.0 | 基地址(保留) |
224.0.0.1 | 本子网上所有地址 |
224.0.0.2 | 本子网上所有的路由器 |
224.0.0.4 | 网段中的所有DVMRP路由器 |
224.0.0.5 | 所有的OSPF路由器 |
224.0.0.6 | 所有的OSPF指派路由 |
224.0.0.9 | 所有RIPv2路由器 |
224.0.0.13 | 所有PIM路由器 |
liming@yahoo.com.cn
信头、信体和签名区
信头包含:to(邮件的收信人地址)、From(邮件的发件人地址)、Subject(邮件主题)、content(邮件内容)、结束标志、签名区
Userid(用户标识)@domain(域名)
用户标识不是唯一的,唯一的条件就是用户标识和域名的结合必须是唯一的,在同一个域中的用户标识不能相同。
·模型设计的差别
·层数和层间调用关系不同原设计差别
·可靠性的处理不同
·标准效能的差异
·市场支持的差异
·应用层(消息)
·传输层(节)
·网络层(数据报)
·数据链路层(帧)
·物理层(数据位)
A类
B类
C类
WinSOck 库有两个版本,WinSOck1和WinSOck2,大部分都使用winSOck2,需要添加头文件winSOck2_h,同时也要添加WS2-32.lib库的链接
#include<winSOck.h>
#pragma comment(lib,”WS2_32”)
class CInitSOck
{
public:
CInitSOck(BYTE minorVer=2,BYTE majorVer=2)
{ //初始化WS2_32.dll
WSADATA wsaData;
WORD SOckVersion=MAKEWORD(minorVer,majorVer);
if(::WSAStartup(SOckVersion,&wsaData)!=0)
{ exit(0); }
}
~CInitSOck()
{ ::WSACleanup()}; }
};
in为传入参数,表示一个结构型的IP主机地址,该函数将一个32位数字表示的IP地址转换成点分十进制P地址字符串
该函数将一个点分十进制IP地址字符串转换成32位数字表示的IP地址。
u_long htonl( u_long hostlong )
4字节主机字节序表示的整数转换为4字节相应的网络字节序表示的整数
u _short htons( u_short hostshort )
2字节主机字节序表示的整数转换为2字节相应的网络字节序表示的整数
u_long ntohl( u_long netlong )
4字节网络字节序表示的整数转换为4字节相应的主机字节序表示的整数
u _short ntohs( u_short netshort )
2字节网络字节序表示的整数转换为2字节相应的主机字节序表示的整数
?
①创建套接字(SOcket)
②绑定IP地址和端口(bind)
③收发数据(sendto/recvfrom)
④关闭连接(closeSOcket)
①创建套接字(SOcket)
②收发数据(sendto/recvfrom)
③关闭连接(closeSOcket)
WinSOck提供了一些I/O模型帮助应用程序以异步方式在一个或者多个套接字上管理I/O。大体上,这样的I/O模型共有6种:阻塞(blocking)模型、选择(select)模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠(overlapped)模型和完成端口(conpletion port)模型;
要学会区分这几种模型之间的工作原理,默认工作模式就是阻塞模式;
因为使用select函数来管理I/O而得名
该模型的设计源自UNIX 系统,
Select()返回时,如果有下列事件发生,对应的套接字将被标识
套接字集合fd set
typedef struct fd_set{
u_int
fd_count;
SOCKET fd_array[FD_SETSIZE];
}fd_set;
FD_ZERO(*set)
//初始化set为空集合。集合在使用前总是要被清空。
FD_CLR(s,*set)
//从set移除套接字s。
FD_ISSET(s,*set)
//检查s是不是set的成员,如果是返回TRUE
FD_SET(s,*set)
//添加套接字到集合
特点:
(2)没创建一个套接字,就创建一个事件对象,把它们的句柄分别放入上面的两个表中,并调用WSAEventSelect添加他们的关
(3)调用WSAWaitForMultipleEvents 在所有事件对象上等待,此函数返回后,我们对事件句柄表中的每一个事件调用 WSAWaitForMultipleEvents 函数,以便确认在哪些套接字上发生了网络事件
(4)处理发生的网络事件,继续在事件对象上等待
????????让应用程序使用一个重叠的数据结构,一次投递一个或多个winsock I/o请求。当这些I /O请求完成后,应用程序可立即实现对I/O数据的处理。
?
sOCKET sRaw=socket(AF_INET,SOCK_RAW,IPPRPTP_ICMP);
USHORT checksum(USHORT*buffer,int size)
{unsigned long cksum=O;
while(size>1)
{ cksum+=*buffer++;
size-=sizeof(USHORT);}
if(size)
{ cksum十=*(UCHAR *)buffer;}
cksum=(cksum>>16)+(cksum&Oxffff);cksum+=(cksum>>16);
return (USHORT)(~cksum);
}
版本
字段为4位,包含该数据报的IP协议的版本信息。
首部长度
为4位,用于表示IP数据报首部的长度服务类型为8位,有时也称为TOS ( Type Of
Service)
总长度
总长度指首部和数据之和的长度,单位为字节。
标识
占16位。IP层维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。
标志(Flag)
占3位,但目前只有2位有意义
片偏移
占13位。较长的分组在分片后,某片在原分组中的相对位置。
寿命TTL (Time to Live)
也称生存时间,设置了该数据报在互联网中允许存在的时间,以秒为单位。
协议
占8位,协议字段指出此数据报携带的数据是使用何种协议
首部校验和
占16位,用来保证首部数据的完整性。
源IP地址和目的IP地址
分别是发送主机的IP地址和接收主机的P地址。
IP选项
用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40个字节不等。
填充字段
取决于IP选项的长度(最大值是40字节),其目的是保证数据报首部为32位的整数倍。填充时,填充内容为全0
UDP头结构
typedef struct UDPHeader
{
USHORT sourcePort;//源端口号
USHORT destinationPort;//目的端口号
USHORT len;//封包长度
USHORT checksum;//校验和
}
UDPHeader,*PUDPHeader;
????????POP3是适用于CIS结构的脱机模型的电子邮件协议。POP3 (Post Office Protocol 3)即邮局协议的第3个版本。它规定:怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。
使用TCP 110号端口
网络连接函数
SOcket创建套接字
bind绑定本机端口
connect建立连接listen监听端口
accept接受连接
recv, recvfrom数据接收send, sendto数据发送
close, shutdown关闭套接字
创建套接字SOcket()
创建一个套接字,需要指定地址家族(如AF_INET或AF_INET6)、套接字类型(如SOCK_STREAM表示面向连接的TCP)和协议(通常为0,让系统选择合适的协议)。
应用程序在使用套接字通信前,必须要拥有一个套接字,使用SOcket()函数来给应用程序创建一个套接字。
SOCKET?SOcket(int?af,?int?type,?int?protocol);
指定本地地址一bind
将创建的套接字与本地地址(IP地址和端口号)绑定。对于服务器端,这是必要的步骤,以指定服务的监听地址和端口。
int bind(
SOCKET s,
const struct SOckaddr name,
int namelen
);
服务器端启动监听一listen()函数
int listen( SOCKETs, int backlog
S代表一个已绑定了地址,但还未建立连接的套接字描述字
backlog指定了正在等待连接的最大队列长度
在服务器端,调用此函数使套接字进入被动监听状态,等待客户端的连接请求。需要指定同时可以排队的最大连接数量。
在服务器端,此函数用于接受客户端的连接请求。它会阻塞直到有新的连接请求到达,然后返回一个新的套接字描述符,用于与该客户端进行通信。
SOCKET accept(
SOCKETs,
struct SOckaddr FAR * addr,
int FAR *addrlen
);
客户端请求连接一connect()函数
在客户端,此函数用于发起与服务器的连接请求。需要提供服务器的地址(IP地址和端口号)。
int connect(
SOCKET S,
const struct SOckaddr FAR *n
ame,
int namelen
);
Connect(函数的说明
TCP客户端使用该函数请求建立连接时,将激活三次握手;
UDP的客户端调用该函数并非真正发出连接请求,调用直接返回并保存服务器地址信息;
这两个函数用于在已建立连接的套接字上发送和接收数据。send()用于发送数据,recv()用于接收数据。它们都可以处理字节流,并可能需要处理部分数据的发送或接收。
int send(
SOCKETs,
const char FAR * buf,int len,
int flags);
int recv(
SOCKETs,char FAR* buf,int len,
int flags);
用于关闭套接字,释放相关资源。当通信完成或者发生错误时,应该关闭套接字。
int closeSOcket(
SOCKETs
);
两个关键函数:
getSOckopt(SOCKETs , int level , int optname,char* optval , int* optlen);
setSOckopt(SOCKET s , int level , int optname,char*optval , int* optlen);
level
常见级别:
SOL_SOCKET(对应应用层)
IPPROTO_TCP(对应传输层的TCP协议IPPROTO_UDP (对应传输层的UDP协议)
IPPROTO_IP(对应网络层的IP协议)
opname
选项值 | 类型 | 意义 |
SO?_ACCEPTCONN | BOOL | 套接口正在用listen()监听 |
SO_BROADCAST | BOOL | 套接口设置为传送广播信息 |
SO_CONNECT TIME | int | 返回连接建立的时间 |
SO_DONTROUTE | BOOL | 禁止路由选择 |
SO_REUSEADDR | BOOL | 套接口和一个已在使用中的地址捆绑 |
SO_EXCLUSIVEADDRUSE | BOOL | 套接口绑定的端口不能重用 |
SO_RcVBUF /SO?_SNDBUF | int | 设置发送/接收缓冲区的大小 |
SO_RcVTIMEOSO_SNDTIMEO | int | 设置套接口发送/接收数据的超时值 |
?I/O控制命令