网络协议分析复习笔记

发布时间:2024年01月16日
  • 定义类

(一)翻译

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(域名)

用户标识不是唯一的,唯一的条件就是用户标识和域名的结合必须是唯一的,在同一个域中的用户标识不能相同。

(八)0SI/RM参考模型与TCP/IP参考模型的比较

  1. 区别

·模型设计的差别

·层数和层间调用关系不同原设计差别

·可靠性的处理不同

·标准效能的差异

·市场支持的差异

(九)传递的消息格式

·应用层(消息)

·传输层(节)

·网络层(数据报)

·数据链路层(帧)

·物理层(数据位)

  • IP地址格式和分类
  1. 地址的有效范围
  1. 一台主机能使用的A类地址的有效范围是:1.0.0.1~~126.255.255.254。
  2. 一台主机能使用的B类地址的有效范围是:128.1.0.1~191.254.255.254
  3. 一台主机能使用的C类地址的有效范围是:192.0.1.1~223.255.254.254

  1. D类地址
  1. ·用于多播D类地址的范围是224.0.0.0~239.255.255.255.E类地址
  2. ·预留的同时也可用于实验,不能被分配给主机。

3.内部网可选的地址

A类

  1. 10.0.0.0~10.255.255.255

B类

  1. 172.16.0.0~172.31.255.255

C类

  1. 192.168.0.0~~192.168.255.255

(十一)WinSOck 库的两个版本

WinSOck 库有两个版本,WinSOck1和WinSOck2,大部分都使用winSOck2,需要添加头文件winSOck2_h,同时也要添加WS2-32.lib的链接

十二)封装CInitSOck

#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()};		 }
};

(十三)IP地址转换函数

1. char * inet ntoa ( struct in _addr in )

in为传入参数,表示一个结构型的IP主机地址,该函数将一个32位数字表示的IP地址转换成点分十进制P地址字符串

2.unsigned long inet_addr(const char FAR*cp)

该函数将一个点分十进制IP地址字符串转换成32位数字表示的IP地址。

3.字节序转换函数

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字节相应的主机字节序表示的整数

  • 一般背诵

1、面向连接的C/S程序工作流程图

?

2、UDP编程流程

  1. 服务器端程序设计流程

①创建套接字(SOcket)

②绑定IP地址和端口(bind)

③收发数据(sendto/recvfrom)

④关闭连接(closeSOcket)

  1. 客户端程序设计流程

①创建套接字(SOcket)

②收发数据(sendto/recvfrom)

③关闭连接(closeSOcket)

3、六种I/O模型(阻塞和完成端口没涉及)

WinSOck提供了一些I/O模型帮助应用程序以异步方式在一个或者多个套接字上管理I/O。大体上,这样的I/O模型共有6种:阻塞(blocking)模型、选择(select)模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠(overlapped)模型和完成端口(conpletion port)模型;

要学会区分这几种模型之间的工作原理,默认工作模式就是阻塞模式;

3.1、Select模型

  1. 特点:

因为使用select函数来管理I/O而得名

该模型的设计源自UNIX 系统,

Select()返回时,如果有下列事件发生,对应的套接字将被标识

  1. 对于readfds,主要有以下事件:数据可读
  2. 连接已经关闭、重启或中断
  3. listen已经调用,并且有一个连接未决,accept函数将成功对于writefds,主要有以下事件:
  4. 数据能够发送
  5. 如果一个非阻塞连接调用正在被处理,连接已经成功对于exceptfds,主要有以下事件:
  6. 如果一个非阻塞连接调用正在被处理,连接企图失败
  7. OOB数据可读

套接字集合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)

//添加套接字到集合

3.2、WSAAsyncSelect模型

特点:

  1. WSAAsyncSelect模型允许应用程序以Windows消息的形式接收网络事件通知;
  2. MFC中的CSOcket类也使用该模型。

3.3、WSAEventSelect模型

  1. 特点:
  2. 使用WSAEventSelect函数
  3. WSAEventSelect是一种异步IO模型.

  1. 编程基本步骤:
    (1)创建一个事件句柄表和一个对应的套接字句柄表

(2)没创建一个套接字,就创建一个事件对象,把它们的句柄分别放入上面的两个表中,并调用WSAEventSelect添加他们的关

(3)调用WSAWaitForMultipleEvents 在所有事件对象上等待,此函数返回后,我们对事件句柄表中的每一个事件调用 WSAWaitForMultipleEvents 函数,以便确认在哪些套接字上发生了网络事件

(4)处理发生的网络事件,继续在事件对象上等待

3.4、重叠模型

  1. 特点(原理)

????????让应用程序使用一个重叠的数据结构,一次投递一个或多个winsock I/o请求。当这些I /O请求完成后,应用程序可立即实现对I/O数据的处理。
?

4、原始套接字(P106)

  1. 创建套接字方
sOCKET sRaw=socket(AF_INET,SOCK_RAW,IPPRPTP_ICMP);
  1. ICMP协议
  2. 协议头

  1. 校验和()
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);
}

5、IPV4头结构

版本

字段为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

6、UDP

UDP头结构
typedef struct UDPHeader
{
USHORT sourcePort;//源端口号
USHORT destinationPort;//目的端口号
USHORT len;//封包长度
USHORT checksum;//校验和
}
UDPHeader,*PUDPHeader;

7、邮件工作整体流程掌握

8SMTP

  1. 基本命令

9POP3

  1. 定义

????????POP3是适用于CIS结构的脱机模型的电子邮件协议。POP3 (Post Office Protocol 3)即邮局协议的第3个版本。它规定:怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。

使用TCP 110号端口

2.? 三种状态

  1. POP3原理

三、代码类

  1. TCP面向连接通信的7个核心API

网络连接函数

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指定了正在等待连接的最大队列长度

在服务器端,调用此函数使套接字进入被动监听状态,等待客户端的连接请求。需要指定同时可以排队的最大连接数量。

  1. accept():

在服务器端,此函数用于接受客户端的连接请求。它会阻塞直到有新的连接请求到达,然后返回一个新的套接字描述符,用于与该客户端进行通信。

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的客户端调用该函数并非真正发出连接请求,调用直接返回并保存服务器地址信息;

  1. send() 和 recv():

这两个函数用于在已建立连接的套接字上发送和接收数据。send()用于发送数据,recv()用于接收数据。它们都可以处理字节流,并可能需要处理部分数据的发送或接收。

int send(

SOCKETs,

const char FAR * buf,int len,

int flags);

int recv(

SOCKETs,char FAR* buf,int len,

int flags);

  1. close():

用于关闭套接字,释放相关资源。当通信完成或者发生错误时,应该关闭套接字。

int closeSOcket(

SOCKETs

);

  1. 互联网广播和IP多播

两个关键函数:

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

设置套接口发送/接收数据的超时值

  1. IPPROTO_IP级别

  1. IP_HDRINCL: BOOL类型。如果值为TRUE,IP头和数据会一块提交给Winsock 发送调用。设置IP_HDRNCL选项为TRUE,导致发送函数在数据前包含IP头,这样,当调用发送函数时,必须在数据前包含整个IP头,正确填充P头中的每个域。这个选项仅对SOCK_RAW类型的套接字有效。讲述原始套接字时还会详细讨论此选项。
  2. IP_TTL: int类型。设置和获取IP头中的TTL参数。数据报使用TTL域来限制它能够经过的路由器的数量。此限制的目的是防止路由陷入死循环。数据报经过的每个路由器将数据报的TTL值减1,当值减为0时.数据报就会被丢弃。

?I/O控制命令

  1. FIONBIO可以将套接字模式从阻塞更改为非阻塞
  2. 注意:在创建套接字时默认情况下它是阻塞模式。
  3. FIONREAD可以返回套接字上读取的数据的大小sIo RCVALL可以接收网络上的所有封包;

文章来源:https://blog.csdn.net/qq_61567782/article/details/135599866
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。