HTTP文档传输协议(2)

在上一篇博客中(https://blog.csdn.net/Mr_suen/article/details/108116504),太上皇介绍了HTTP文档发送的简要流程,这为朕的工作深入提供了参考,本章主要是整理了在API接口中进行文件传输协议的实现。

关于Socket的那些事

Socket是在应用层和传输层之间的一个抽象层,他把TCP/IP层复杂的操作抽象成几个简单的接口,供应用层调用实现进程在网络中的通信。在通信模型中,Server和Client各自建立了一个Socket对象,然后通过Socket对象对数据进行传输。一般情况下,服务器会处于一个循环状态,使用listen()监听某个端口是否有连接请求,等待客户端建立完Socket发出Connect(连接)请求,Server端向Client端发回Accept(接收)消息。一个连接就建立起来了,Server端和Client端都可以通过Send、Write等方法与对方通信。

对于一个功能齐全的Socket,其工作过程包括如下几个步骤:

  1. 创建Socket;
  2. 打开连接到Socket的输入/出流;
  3. 按照一定的协议对Socket进行读/写操作;
  4. 关闭Socket。

套接字可看作是不同主机间的进程进行双向通信的虚拟管道端点:网络中两台主机各自在自己机器上建立通信的端点--套接字,然后使用套接字进行数据通信。一个套接字包含五个基本元素:协议类型、本地IP地址、本地端口、远端IP地址和远端端口。在操作系统中,套接字是一种系统资源,应用程序使用时应向操作系统申请或注册,使用结束后应用程序应释放该该套接字。根据网络通信的特征,套接字分为三类:流套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)。流套接字是面向连接的,它提供双向的、有序的、无差错、无重复并且无记录边界的数据流服务,适用于处理大量数据,提供可靠的服务。数据报套接字是无连接的,它支持双向的数据传输,具有开销小、数据传输效率高的特点,但不保证数据传输的可靠性、有序性和无重复性,适合少量数据传输、以及时间敏感的音/视频等多媒体数据传输。原始套接字(SOCK_RAW)可以用作对底层协议(如IP或ICM)的直接访问。

HTTP文档传输协议(2)

其实在上图中已经描述了服务器和客户端进行通信及其通信前后的工作 ,在上一篇文章中提到过,http中的文档传输可以通过流传输,同样,在socket中也可以通过流进行传输。流套接字(SOCK_STREAM)类型的套接口为全双向字节流。对于流类套接口,在接收或发送数据前必需处于已连接状态。用connect()调用建立与另一套接口的连接,连接成功后,即可用send()和recv()传送数据。当会话结束后,调用closesocket()。带外数据根据规定用send()和recv()来接收。

实现SOCK_STREAM类型套接口的通讯协议保证数据不会丢失也不会重复。如果终端协议有缓冲区空间,且数据不能在一定时间成功发送,则认为连接中断,其后续的调用也将以WSAETIMEOUT错误返回。

SOCK_DGRAM类型套接口允许使用sendto()和recvfrom()从任意端口发送或接收数据报。如果这样一个套接口用connect()与一个指定端口连接,则可用send()和recv()与该端口进行数据报的发送与接收。

对socket描述的有点多了,后面朕会详细介绍一下socket的通信原理,敬请期待。

文件传输协议的介绍

FTP是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的控制文件的双向传输。在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/服务器系统,该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为FTP协议。在通信协议的分层模型中,文件传输协议是在TCP(Transmission controlProtocol,传输控制协议)之上的一个应用层协议,应用程序之间的通信需要用到传输层提供的字节流透明无误传输服务。Windows操作系统具有TCP/IP协议栈,应用程序可通过Winsock API函数的调用实现端到端透明数据链接的建立。

FTP具有以下特点

  1. 文件传送协议只提供文件传送的一些基本的服务,它是面向连接的服务,使用TCP作为传输协议,以提供可靠的运输服务。
  2. FTP的主要作用是在不同计算机系统间传送文件,它与这两台计算机所处的位置、连接的方式以及使用的操作系统无关。
  3. FTP使用客户/服务器方式。

文件传输协议的主要工作原理

文件传送协议FTP只提供文件传送的一些基本的服务,它使用TCP可靠的运输服务。FTP的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。

一个FTP服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。主进程的工作步骤如下:

  1. 打开熟知端口(端口号为21),使客户进程能够连接上。
  2. 等待客户进程发出连接请求。
  3. 启动从属进程来处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。
  4. 回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发地进行。

HTTP文档传输协议(2)

FTP的工作情况如图所示。在进行文件传输时,FTP的客户和服务器之间要建立两个连接:“控制连接”和“数据连接”。

客户端发起控制连接,服务器端发起数据连接。当客户进程向服务器进程发出建立连接请求时,首先要寻找连接服务器进程的熟知端口(21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接,连接建立时,控制进程和控制连接随之创建。控制进程在接受到FTP客户发送过来的请求后就创建传送进程和数据连接。服务器进程用传送数据的熟知端口(20)与客户进程所提供的端口号建立数据传送连接。由于FTP使用了两个不同的端口号,所以数据连接与控制连接不会发生混乱。

大多数FTP服务都是匿名服务。匿名FTP服务的实质是:提供服务的机构在它的FTP服务器上建立一个公开账户(一般为anonymous),并赋予该账户访问公共目录的权限,以便提供免费服务。如果用户要访问这些提供匿名服务的FTP服务器,一般不需要输入用户名与用户密码。为了保证FTP服务器的安全,几乎所有的匿名FTP服务器都只允许用户下载文件,而不允许用户上载文件。在Internet中,许多公司、大学的主机上含有数量众多的各种程序与文件,这是Internet的巨大与宝贵的信息资源。通过使用FTP服务,用户就可以方便地访问这些信息资源。

除了FTP,朕还了解到可以通过基于TFTP或UDP的协议,但是目前还没有深入探究,这里就不为大家介绍了,大家可以看看这个:https://www.cnblogs.com/chusiyong/p/11394710.html,无论哪种机制,Socket总是离不开的,这也就表现出了套接字的重要性,后面我会为大家完整的整理一本武林秘籍——《Socket密传》。

感谢您的参考,需要帮助的话请留言哦。