各层次之间,下层为上层提供服务,上层使用下层提供的功能。
即服务是垂直的。
而协议是对于某一层来说的,所以协议是水平的。
综合来讲就是: 服务是垂直的,协议是水平的。
osi的每一层中,对等层之间都有一条虚拟的数据传输通路,注意是虚拟的。
因为实际的传输通路只有一个,那就是物理层的。虽然我们说各层建立一个数据传输通路,那也是通过物理层建立起来的。说各层之间传送数据,那也是通过物理层传输的。
1、各层的功能:
物理层:传输比特流的数据通路。工作在物理层的设备有:集线器,中继器
数据链路层:数据的传输通路,将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。传输的是帧。提供了帧同步,流量控制,差错控制等服务。传输前需要建立一条虚拟的数据链路,所以被称作数据链路层。工作在数据链路层的设备有:交换机
网络层:传输的是数据包。目的是实现两个端系统之间的数据透明传送。什么叫透明?就是你只需要知道它把事情做好了就行,不用管他是怎么做的。工作在网络层的设备有路由器。
传输层:提供端到端(进程到进程)之间的可靠传输。TCP/UDP
会话层: 建立两个进程之间的会话,传输大文件有用。
表示层:负责编解码,加解密。
应用层:向用户提供服务。
2、已经体现在1中了。
3、各层的应用。体现在1中了。
4、网络编程可以做什么?
可以收发邮件,制作网络爬虫,制作渗透测试工具,创建web应用等。
FTP:
所谓的主动与被动,是针对Server
端来说的。Server
端的数据端口主动连接Client
端的数据端口,称为主动模式,反之,称为被动模式。
socket最早出现在了unix系统中。socket也被称为套接字。
一图胜千言:
socket()函数:
功能:
建立一个通信原点。
参数之falily:
参数之type:
C语言中的函数原型:
int socket ( int family, int type, int protocol);
bind()函数
功能:配置本地addr (包括ip 和 port)。Server端必须要用bind()配置。client端是可选的,当然啦,如果不配置,则系统给分配一个。
bind()的C语言函数原型:
int bind ( int sockfd, const struct sockaddr *myaddr, socklen_t addrlen );
参数:
太长不想写了。
返回值:
0则正常,-1则出错。
bind()的工作原理:
也就是说,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
上图补充:因为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()
send()
功能:
用于在TCP中发送消息,也可用于使用了connect的udp client 发送消息。
send()可以阻塞,直到发送完毕或者出错。
C语言的send()原型:
int send(int sockfd, const void *msg, int len, int flags);
recv()函数
C语言的recv函数原型:
ssize_t recv ( int fd, void *buf, size_t len, int flags);
recvfrom()函数
C语言中的函数原型:
int recvfrom (int sockfd, void *buf, int len, unsigned int flags,
struct sockaddr *from, int *fromlen);
sendto()函数
C语言中的sendto()函数原型:
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
作为一个通信原点必须要有的:
socket函数
close函数
作为一个tcp server必须要有的:
socket函数 bind函数 listen函数 accept函数 close函数
作为一个tcp client 必须要有的:
socket函数 connect函数 close函数
作为一个udp server必须要有的:
socket 函数 bind函数 close函数
作为一个udp client 必须要有的:
socket函数 close函数