20190521——网络程序设计

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

OSI七层



Socket

什么是socket
应用程序与网络协议软件+网络硬件之间的接口
int s = socket(domain, type, protocol);
socket 系统调用只是创建了接口,没有包含任何地址信息!

socket的连接过程
1)服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态
2)客户端请求,是指客户端的套接字提出连接请求,要连接目标服务器的套接字,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器的地址和端口号,然后向服务器套接字提出连接的请求
3)连接确认,当服务器套接字监听或者接受到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器套接字的描述发送给客户端,一旦客户确立该描述,连接就建立好了,而服务器套接字继续处于监听状态,继续接受其他客户端发送的套接字请求

常用的函数

创建函数

int socket(int domain,int type,int protocol)

domain协议域,又称协议族,AF_INET决定了要用ipv4的地址(32位)与端口号(16位)的组合,AF_UNIX决定要用一个绝对路径作为地址

type指socket类型,SOCK_STREAM、SOCK_DGRAM,前者是面对连接的SOCKET,而后者是无连接的SOCKET

protocol:指定协议,IPPROTO_TCP/UDP/STCP/TIPC

如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET(Linux下失败返回-1)。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。

绑定
bind函数

int bind(SOCKET socket, const struct sockaddr* address, socklen_t address_len);

socket是一个套接字的描述符

address 是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号

address_len 确定了address的缓冲值长度

接受

int recv(SOCKET socket, char FAR* buf, int len, int flags);

socket:socket描述符
buf:用于接受数据的缓冲区
len:缓冲区长度
flags:调用方式

若无错误发生,recv()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

int accept( int fd, struct socketaddr* addr, socklen_t* len);

fd:套接字描述符。
addr:返回连接着的地址
len:接收返回地址的缓冲区长度

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

TCP不保证接受端每次收到数据的长度与发送时相同
TCP可能将send的长数据分割为小段发送,也可能将许多短块积累成长段发送
TCP将发送数据看成字节流,没有块边界
具体发送时的分合取决于TCP的窗口
程序需要循环读取socket才能收到全部发送数据。

getsockname与getpeername是返回套接口关联的本地协议地址和远程协议地址。
int getsockname(int sockfd, struct sockaddr * localaddr, socken_t * addrlen);

int getpeername(int sockfd, struct sockaddr * peeraddr, socken_t * addrlen);

返回0表示成功,返回1表示出错

对于服务器来说,在bind以后就可以调用getsockname来获取本地地址和端口,getpeername只有在链接建立以后才调用,否则不能正确获得对方地址和端口

对于客户端来说,在调用socket时候内核还不会分配IP和端口,此时调用getsockname不会获得正确的端口和地址(当然链接没建立更不可能调用getpeername),当然如果调用了bind 以后可以使用getsockname。

没有链接的UDP不能调用getpeername,但是可以调用getsockname,和TCP一样,他的地址和端口不是在调用socket就指定了,而是在第一次调用sendto函数以后

已经链接的UDP,在调用connect以后,这2个函数都是可以用的(同样,getpeername也没太大意义。如果你不知道对方的地址和端口,不可能会调用connect)。

对于有连接的socket,当客户只访问一个服务员时,不用再指定服务员的地址了。
无连接的UDP socket每次发送都要在sendto里指定服务员地址

int status = select(nfds, &readfds, &writefds, &exceptfds, &timeout);
status: 准备就绪的对象的数量, -1 错误
nfds: 最大的文件描述符+1
readfds: 检查是否可读的文件描述符集合
writefds:检查是否可写的文件描述符集合
exceptfds:要检查的注册了异常的文件描述符集合
timeout: select 从开始到返回的时间,即使没有就绪对象 ,0 or 无穷

并发服务器程序
为每个顾客派生一个子进程提供服务,这是Unix服务器程序通常的做法。
使用线程(轻量进程)替代进程实现并发服务器程序。
得到进程的id,监听socket,创建一个socket,然后开始绑定
fork()在子进程和父进程中返回不同的值
父进程:子进程的id
子进程: 0
据此进程可知自己是父进程还是子进程

execve系统调用将进程图像替换为其他程序,但进程id不变。

调用sigaction函数确定
信号处理函数
忽略SIG_IGN
缺省方式SIG_DFL

能够永久阻塞的系统调用,称为慢系统调用。当进程捕获到中断,中断处理结束时,某些系统中慢系统调用将返回错误EINTER,某些则自动继续执行系统调用。

wait是阻塞的
waitpid非阻塞
waitpid可不阻塞,因此通过查询每个子进程的状态,得到终止进程的pid,进行善后处理。

inetd是监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求。它可以为多种服务管理连接,当 inetd 接到连接时,它能够确定连接所需的程序,启动相应的进程,并把 socket 交给它 (服务 socket 会作为程序的标准输入、 输出和错误输出描述符)。 使用 inetd 来运行那些负载不重的服务有助于降低系统负载,因为它不需要为每个服务都启动独立的服务程序。

函数dup和dup2提供了复制文件描述符的功能。
与dup功能相同,但副本文件描述符是newfd

子进程如何得到客户的地址?
描述符0,1,2都对应socket,可通过getpeername 得到。



数据链路层
rawsocket:raw socket,即原始套接字,可以接收本机网卡上的数据帧或者数据包,对于监听网络的流量和分析是很有作用的,一共可以有4种方式创建这种socket。
raw socket中文叫原始套接字,它和其他的套接字的不同之处在于它工作在网络层或数据链路层,而其他类型的套接字工作在传输层,只能进行传输层数据操作。

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

IGMP(Internet Group Manage Protocol):Internet组管理协议,提供internet网际多点
传送的功能,即将一个ip包拷贝给多个host,windows系列采用了这个协议,因为此项技术
尚不成熟,因此被一些人用来攻击windows系统,尤其是对win98,因为对win95有oob攻击.
受到IGMP攻击的症状是首先出现蓝屏,然后网速变得极慢,有的甚至鼠标,键盘均不管用.

rawsocket可以发送1 (ICMP), 2 (IGMP), 6 (TCP), and 17 (UDP).

发送IP包通过raw socket的IP_HDRINCL实现

IP Checksum Always filled in.
Source Address Filled in when zero.
Packet Id Filled in when zero.
Total Length Always filled in.

BSD BPF
SVR4 DLPI
Linux SOCK_PACKET

包存在一段存储区内
根据包中的协议可知道包的结构
根据协议定义包结构
链路包头
IP包头
TCP包头
包负载

goto语句只能在一个函数内部跳转

etjmp设置返回位置
env是特定数据类型jmp_buf
env相当于一个标号
env应设为全局变量,使得longjmp能够访问到
调用longjmp后程序跳转到setjmp处,setjmp返回。
longjmp使用哪个env变量,就跳到此env的setjmp处
setjmp的返回值通过val设置,可区分从哪里跳过来

全局或静态变量,变量的值为调用longjmp时的值



RPC远程过程调用

远程过程调用与报文传递方式相比有许多优点:语义清楚、简单、容易使用;对通信来说也非常简单,有较高的效率;有通用性,象在单机上计算时,过程就象是算法两个部分之间进行通信的最重要的机构一样。

1.调用客户端句柄;执行传送参数
2.调用本地系统内核发送网络消息
3.消息传送到远程主机
4.服务器句柄得到消息并取得参数
5.执行远程过程

6.执行的过程将结果返回服务器句柄
7.服务器句柄返回结果,调用远程系统内核
8.消息传回本地主机
9.客户句柄由内核接收消息
10.客户接收句柄返回的数据

存根负责接收本地方法调用,并将它们委派给各自的具体实现对象



dpi
深度报文检测
基于数据包的深度检测技术,针对不同的网络应用层载荷(例如HTTP、DNS等)进行深度检测,通过对报文的有效载荷检测决定其合法性。
统一DPI指一套DPI设备对链路上的流量进行采集与识别,并将满足其它系统所需的流量或分析统计数据分发给各第三方应用系统服务器。

异常检测
统计
机器学习方法:神经网络、数据挖掘
也称为基于行为的检测
首先建立起用户的正常使用模式,即知识库
标识出不符合正常模式的行为活动

缓存法(Cache algorithm)
TCP/IP协议栈,如:Linux、FreeBSD等
绝大多数IDS,如:Snort, NFR和Prelude IDS
概要:将分片缓存并拼接到适当位置,在全部分片到达之后,重建重组的数据包供下一步处理。
存储占用大
易受存储耗尽攻击

n-Line Reassembly,在线乱序流重组匹配算法
特点
低内存开销
On-line 处理
算法
分片处理
不缓存分片,用索引记录分片中的有用信息
模式匹配
在有用信息中搜索分布在多个分片中的模式



多线程
程是指在系统中正在运行的一个应用程序;程序一旦运行就是进程,或者更专业化来说:进程是指程序执行时的一个实例。
线程是进程的一个实体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一共包括10个以上的聊天程序版本!绝对物有所值! 为感谢大家长期的支持,我将下载所需的资源分下调为2。网络聊天程序设计(可选)  实验要求 1、分析典型网络聊天应用软件(如QQ、MSN等)的实现原理,模拟设计一套网络聊天应用程序,必须实现以下功能: ①按照C/S结构分别设计服务端程序和客户端程序; ②服务端通过图形用户界面实现对服务器的控制,负责维护用户帐户和用户群,并维护用户信息、维持客户端之间的端对端通信和群聊通信、适时维护用户在线信息,并能够发送广播消息。 2、增加尽可能多的功能,用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 3、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。  实验提示 1、客户端之间的通信是通过服务器进行转发的,对于两个客户端,服务器需要创建两个套接字分别维持与客户端之间的连接。当客户端需要向另一个客户发送消息时,它首先将消息发送到服务器,由服务器根据目标用户帐户转发到目标主机。 2、群聊是采用多播技术实现的,也可以采用单播技术实现,但是服务器开销会增加。具体说来,若采用组播技术,当服务端收到来自一个客户端的消息后,向预先分配的该组组播地址转发该消息。若采用单播技术,服务端需要向该组内的所有客户端一一转发该消息。 3、广播消息通过广播方式发送由服务端创建的消息。 4、服务端根据客户的连接和断开情况,实时向其它客户端发送用户在线信息。 实验题目二:自选网络通信程序设计(可选)  实验要求 可以自选与网络通信相关的设计题目,要求如下: 1、在确定实验题目、设计内容以及设计功能指标要求后,向实验指导教师提交书面申请,由实验指导教师根据所选实验题目的难度和工作量确定立题后方能开始实验。 2、选择的实验题目必须具有一定综合性,并能够利用网络通信原理加以解决,同时需要具备一定的工作量。 3、设计的结果要求用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 4、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。 5、严禁抄袭别人成果,但可以部分借鉴。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值