网络程序设计复习

第一章:

1、OSI/RM 7层
网络程序设计复习_第1张图片

各层次之间,下层为上层提供服务,上层使用下层提供的功能。
即服务是垂直的。
而协议是对于某一层来说的,所以协议是水平的。
综合来讲就是: 服务是垂直的,协议是水平的。
osi的每一层中,对等层之间都有一条虚拟的数据传输通路,注意是虚拟的。
因为实际的传输通路只有一个,那就是物理层的。虽然我们说各层建立一个数据传输通路,那也是通过物理层建立起来的。说各层之间传送数据,那也是通过物理层传输的。

网络程序设计复习_第2张图片

1、各层的功能:
物理层:传输比特流的数据通路。工作在物理层的设备有:集线器,中继器
数据链路层:数据的传输通路,将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。传输的是帧。提供了帧同步,流量控制,差错控制等服务。传输前需要建立一条虚拟的数据链路,所以被称作数据链路层。工作在数据链路层的设备有:交换机
网络层:传输的是数据包。目的是实现两个端系统之间的数据透明传送。什么叫透明?就是你只需要知道它把事情做好了就行,不用管他是怎么做的。工作在网络层的设备有路由器。
传输层:提供端到端(进程到进程)之间的可靠传输。TCP/UDP
会话层: 建立两个进程之间的会话,传输大文件有用。
表示层:负责编解码,加解密。
应用层:向用户提供服务。

2、已经体现在1中了。
3、各层的应用。体现在1中了。
4、网络编程可以做什么?
可以收发邮件,制作网络爬虫,制作渗透测试工具,创建web应用等。
网络程序设计复习_第3张图片

FTP:
网络程序设计复习_第4张图片
所谓的主动与被动,是针对Server端来说的。Server端的数据端口主动连接Client端的数据端口,称为主动模式,反之,称为被动模式。
网络程序设计复习_第5张图片
网络程序设计复习_第6张图片

第二章之socket

socket是基于CS模式的。
网络程序设计复习_第7张图片
传输层的协议们:
网络程序设计复习_第8张图片

socket最早出现在了unix系统中。socket也被称为套接字。
一图胜千言:
网络程序设计复习_第9张图片
网络程序设计复习_第10张图片

socket原语:
网络程序设计复习_第11张图片

网络程序设计复习_第12张图片
socket()函数:
功能:
建立一个通信原点。
参数之falily:
在这里插入图片描述
参数之type:
在这里插入图片描述

C语言中的函数原型:

int socket ( int family,  int type,  int protocol);

返回值
网络程序设计复习_第13张图片

bind()函数
功能:配置本地addr (包括ip 和 port)。Server端必须要用bind()配置。client端是可选的,当然啦,如果不配置,则系统给分配一个。

bind()的C语言函数原型:

int bind ( int sockfd, const struct sockaddr *myaddr, socklen_t  addrlen );

参数:
太长不想写了。
返回值:
0则正常,-1则出错。

bind()的工作原理:
网络程序设计复习_第14张图片
也就是说,bind在这里,你服务器必须要用bind。 客户端是你想用就给你用,你不用也没关系,系统给你分配一个。
这个是无关TCP还是UDP的。

listen()函数:
功能:
listen函数是专用于TCP server的。作用是开始监听绑定的端口。
执行listen函数后,通信原点(也就是server) 进入到被动监听模式,等待着网络连接。
特性:在正在listen的套接字上执行listen不起作用。
listen函数的C语言原型:

int listen (int sockfd,  int backlog);

参数
backlog代表等待队列的长度。队列满了之后,多余的连接请求会被拒绝。一个新的Client的连接请求被放在接收队列中,等待Server程序调用accept函数接受该连接请求。也就是说,别管等待队列是否为空,只要还没满,所有的请求都得去等待队列里走一遭。

返回值:
正确返回0 出错返回别的。

connect()函数
C语言函数原型:

int connect ( int sockfd, const struct sockaddr *servaddr, 
                       socklen_t addrlen);

作用:
client建立与server的连接。
TCP client必须要有connect() UDP client可以有也可以没有。

返回值:
成功返回0
不成功返回-1

网络程序设计复习_第15张图片
上图补充:因为udp client不调用connect的话,client原点不知道服务器地址,所以要显式的在recvfrom 和 sendto 中体现出来。这两个函数也是udp专用的。

accept()函数
C语言函数原型:

int accept (int sockfd,    struct sockaddr  *cliaddr,  socklen_t *addrlen);

功能:
TCP server端的函数。用于接收客户端的连接请求,产生一个新的socket描述符,它可以用来与发起这个连接请求的客户端进行信息交换。
accept 会阻塞的,如果等待队列中没有连接请求,就会使调用方阻塞,直到有连接请求到达为止。

返回值:
返回一个操作系统创建的新的描述符

发送数据和接收数据的函数:
send() sendto() recv() recvfrom()
网络程序设计复习_第16张图片

send()
功能:
用于在TCP中发送消息,也可用于使用了connect的udp client 发送消息。
send()可以阻塞,直到发送完毕或者出错。

C语言的send()原型:

int send(int sockfd, const void *msg, int len, int flags);

参数:
在这里插入图片描述

网络程序设计复习_第17张图片
在这里插入图片描述

recv()函数
C语言的recv函数原型:

ssize_t recv ( int fd, void *buf, size_t len,  int flags);

网络程序设计复习_第18张图片

网络程序设计复习_第19张图片

recvfrom()函数
C语言中的函数原型:

int recvfrom (int sockfd,  void *buf,  int len,  unsigned int flags,
                            struct sockaddr *from,  int *fromlen); 

网络程序设计复习_第20张图片

sendto()函数
C语言中的sendto()函数原型:

int sendto(int sockfd, const void *msg,  int len, unsigned int flags,  const struct sockaddr *to,  int tolen); 

网络程序设计复习_第21张图片

另外一组读写函数:
read() 和 write()
网络程序设计复习_第22张图片

close()函数
网络程序设计复习_第23张图片

总结:

作为一个通信原点必须要有的:
socket函数
close函数

作为一个tcp server必须要有的:
socket函数 bind函数 listen函数 accept函数 close函数

作为一个tcp client 必须要有的:
socket函数 connect函数 close函数

作为一个udp server必须要有的:
socket 函数 bind函数 close函数

作为一个udp client 必须要有的:
socket函数 close函数

socket调用流程

TCP
网络程序设计复习_第24张图片
网络程序设计复习_第25张图片

UDP
网络程序设计复习_第26张图片
网络程序设计复习_第27张图片

编码

表示层关注所传信息的语法和语义。
网络程序设计复习_第28张图片

网络程序设计复习_第29张图片

网络程序设计复习_第30张图片
网络程序设计复习_第31张图片

网络程序设计复习_第32张图片
网络程序设计复习_第33张图片
网络程序设计复习_第34张图片

网络程序设计复习_第35张图片

BUG示例:
网络程序设计复习_第36张图片

修复示例:
网络程序设计复习_第37张图片

并发

为什么要用并发?
网络程序设计复习_第38张图片
进程:
网络程序设计复习_第39张图片

网络程序设计复习_第40张图片

网络程序设计复习_第41张图片

多线程/多进程服务器的缺点:
网络程序设计复习_第42张图片

解决方案:
多路复用服务器
怎么做?监听多个端口
网络程序设计复习_第43张图片

网络程序设计复习_第44张图片

网络程序设计复习_第45张图片

网络程序设计复习_第46张图片

网络程序设计复习_第47张图片

网络程序设计复习_第48张图片

网络程序设计复习_第49张图片

你可能感兴趣的:(master)