网络编程第一章总结(上一部分)

1.1 TCP/IP协议概述

1.1.1 TCP/IP参考模型

  1. 主机-网络层,最底层,也叫做网络接口层,主要负责接收从互联网络层交来的IP数据报并将其通过低层物理网络发送出去,或者从低层物理网络上接收物理帧并从中抽出IP数据报交给互联网络层。
  2. 互联网络层,也称为IP层,主要负责将源主机的报文分组发送到目的主机,源主机与目的主机可以在同一个网络上,也可以在不同的网络上。IP协议是一种不可靠、无连接的数据报传送服务的协议,它提供的是一种“尽力而为(Best Effort)”的服务。IP协议的协议数据单元是IP分组,由于在IP层提供数据报服务,因此也常将IP分组称为IP数据报。
  3. 传输层,主要负责在互联网中源主机与目的主机的对等进程实体之间提供(可靠的)端到端的数据传输。在TCP/IP参考模型的传输层中定义了两种协议:
    • TCP协议:是一种可靠的面向连接的协议,允许将一台主机的字节流无差错的传送到目的主机。
    • UDP协议:是一种不可靠的无连接协议,它主要用于不要求分组顺序到达的传输服务之中,在基于UDP协议的传输服务中,分组的传输顺序检查与排序由应用层完成。
  4. 应用层,应用层包括了所有的高层协议:
    • 网络终端协议:Telnet
    • 文件传输协议:FTP
    • 简单邮件传输协议:SMTP
    • 域名系统:DNS
    • 简单网络管理协议:SNMP
    • 超文本传输协议:HTTP

1.1.2 TCP的基本工作流程

  1. 两个主机使用TCP协议进行通信可以分为3个阶段:

    • 建立连接

    • 数据传输:

      • 三次握手建立连接

    • 断开连接

      • 四次挥手断开连接

  2. TCP的状态

    • LISTEN:服务器端等待远程客户端连接请求的状态。
    • SYN-SENT:当要访问其他计算机时,首先要发送一个同步信号SYN给要访问的主机,然后进入SYN_SENT状态。如果连接成功,状态会变为ESTABLISHED,因此SYN_SENT状态是非常短暂的。
    • SYN_RCVD:服务器收到客户端的SYN(即连接申请)后,有LISTEN进入此状态,同时回应一个SYN+ACK给客户端。
    • ESTABLISHED:代表一个打开的连接。
    • FIN-WAIT-1:主动关闭的一方发送FIN,请求关闭连接后进入此状态,然后等待对方返回ACK。
    • CLOSE-WAIT:被动关闭的一方收到FIN后,进入此状态,同时发送ACK。
    • FIN-WAIT-2:主动关闭的一方,收到对方返回的ACK后,由FIN-WAIT-1 状态进入此状态。
    • LAST-ACK:被动关闭的一方发送发送FIN给主动关闭的一方,进入此状态,等待对方的ACK。被动关闭的一方收到ACK后,进入CLOSED状态。
    • CLOSING:两边同时发送关闭请求时,主动关闭方会由FIN-WAIT-1 进入此状态,等待被动方返回ACK。
    • TIME-WAIT:共有三个状态进入此状态:
      • 由CLOSING进入
      • 由FIN-WAIT-1 进入
      • 由FIN-WAIT-2 进入
    • CLOSED:没有任何连接状态,超时或连接关闭时进入此状态。
  3. 状态之间的转换

  • TIME_WAIT存在的两个理由就是:
    • 可靠地实现TCP全双工连接的终止;
    • 允许老的重复分节(数据报)在网络中消逝。

1.1.3 TCP/IP网络通信中的客户-服务器模型

  1. 客户/服务器(C/S模型)交互模型如下图所示,发起对等通信的应用程序进程称为客户,而负责等待接收客户通信请求并为客户提供服务的应用程序进程则称为服务器。
  1. 客户-服务器模型中的汇聚点问题及其解决方法
    • 汇聚点问题:当分别启动这两个处于不同地理位置的独立的计算机上的应用程序进程时,由于每个人的操作速度不同,而计算机的运行速度要比人快许多数量级,这将导致速度快的那个人在启动了一个应用程序进程之后,该应用程序进程开始执行并向其对等应用程序进程发送报文,而此时速度慢的那个人还未完成其对等应用程序进程的启动。
    • 如此一来,在几个微秒之内,先启动的应用程序进程将会判断出其对等应用程序进程还不存在,于是,它将发出一条错误消息然后退出。这时,假若第二个应用程序进程启动了,但遗憾的是,它将发现其对等应用程序进程已经终止执行了。按照上述方式,即便是两个应用程序进程继续尝试通信,但由于每个应用程序进程都执行得相当快,因此,在同一时刻双方能相互发送消息的概率还是会非常的低。
    • 为了解决上述汇聚点问题,在客户/服务器模型中,要求每一次通信均由客户进程随机启动,而服务器进程必须处于无限循环等待状态,以等待来自客户的服务请求,并在接收到客户的请求之后,执行必要的计算,然后再将结果返回给客户。其中:发起对等通信的一方称为客户,无限期地等待接收客户通信请求的一方则称为服务器。
  2. 服务器中的并发问题
  1. 客户端进程如何找到服务器套接字的端点地址?客户软件可以使用以下4种方法来找到某个服务器套接字的端点地址:
    • 在编译程序时,将服务器套接字的端点地址说明为常量;
    • 要求用户在启动程序时输入服务器套接字的端点地址;
    • 从本地文件中获取服务器套接字端点地址的有关信息;
    • 通过某个组播或广播协议来查找服务器套接字的端点地址。
  2. 类型分类
    • 在按照使用的传输协议不同可以分为无连接的服务器与面向连接的服务器;
    • 按照是否维护与客户交互活动的信息可以分为有状态服务器与无状态服务器;
    • 按照处理与客户交互的机制不同又可以分为循环服务器与并发服务器。

1.1.4 TCP/IP参考模型的通信原理

  1. TCP/IP参考模型的通信原理如图
  1. 传输层为了实现在网络环境中分布式进程之间的相互通信,需要解决的问题。
    • 进程命名与寻址:

      • TCP/IP参考模型提出了协议端口(Protocol Port,简称端口)的概念,用于标识通信的进程。
      • 端口号一般有两种基本的分配方式,全局分配和本地分配。
      • 一些常用端口:
        1.  端口0:不使用,或者作为特殊的使用。
        2.  端口1-255:保留给特定的服务,TCP和UDP均规定,小于256的端口号才能分配给网上著名的服务。
        3.  端口256-1023:保留给其他的服务,如路由。
        4.  端口1024-4999:可以用作任意客户的端口。
        5.  端口5000-65535:可以用作用户的服务器端口。
      
      • IP号+端口号唯一标识一个完整的进程
    • 多重协议的识别:

      • 在TCP/IP网络环境中,一个应用程序进程最终需要使用一个三元组<协议,本地地址,本地端口号>来唯一地标识。
      • 一个完整的网间通信需要由两个进程组成,并且这两个进程之间只能使用相同的传输层协议才能进行通信,因此,一个完整的网间通信需要用一个五元组<协议,本地地址,本地端口号,远程地址,远程端口号>才能唯一地标识。
      • 二元组<本地地址,本地端口号>称为网间进程通信中的本地端点地址,二元组<远程地址,远程端口号>称为网间进程通信中的远程端点地址。
      • 三元组<协议,本地地址,本地端口号>称为一个半相关,五元组<协议,本地地址,本地端口号,远程地址,远程端口号>则称为一个相关。

1.2 基于套接字的网络通信原理

1.2.1 套接字概述

  1. 套接字是操作系统为实现TCP/IP网络通信所新增加的一个抽象,通信双方进程可通过它来与对方发送或接收数据。
  2. 套接字描述符是一个整数类型的值,与文件描述符是用于标识一个活动的文件一样,套接字描述符则是用于标识一个活动的套接字。
  3. 套接字可以看成是在两个应用程序进程进行通讯连接中的一个端点:当主机A上的应用程序进程a需要和主机B上的应用程序进程b进行通信时,主机A上的应用程序进程a首先将一段信息写入其在本地主机上的Socket A,然后由Socket A将该段信息通过TCP/IP网络发送到主机B上应用程序进程b所对应的Socket B中,最后再由Socket B将该段信息传送给应用程序进程b。
  1. 如何唯一标识一个套接字?
    • 一个套接字又可以看成是在这两个应用程序进程进行通讯连接中的一个端点,由于在网络环境中,一个完整的网络通信连接需要由两个应用程序进程组成,而一个应用程序进程则是用一个半相关<协议,本地地址,本地端口号>来唯一地标识,因此,一个套接字显然也可以用上述半相关<协议,本地地址,本地端口号>来唯一地标识,其中,二元组<本地地址,本地端口号>通常也称为套接字的端点地址。
    • 一个完整的TCP/IP网络通信连接可用通信双方所对应的套接字所组成的套接字对(Socket Pair)来唯一地标识,其中一个套接字运行于客户端,称为客户端套接字(Client Socket),而另一个套接字则运行于服务器端,称为服务器套接字(Server Socket)。
  2. 套接字编程接口的两种实现方式
    • 在操作系统的内核中增加相应的软件来实现;
    • 通过开发操作系统之外的函数库来实现。

1.3网络编程算法设计步骤

1.3.1 TCP客户端算法

  • 步骤1:找到期望通信的服务器套接字端点地址(IP地址+协议端口号);
  • 步骤2:创建本地客户端套接字;
  • 步骤3:为该套接字指明本地端点地址(由TCP/IP协议软件自动选取);
  • 步骤4:建立该套接字到服务器套接字之间的一个TCP连接;
  • 步骤5: 基于建立的TCP连接与服务器进行通信(发送请求与等待应答);
  • 步骤6:通信结束之后,关闭该套接字以释放与之相关的资源(包括TCP连接的释放)。

1.3.2 TCP服务器算法

  • 步骤1:创建本地服务器端套接字;
  • 步骤2:为该套接字指明本地端点地址(将该套接字绑定到它所提供服务的熟知端口上);
  • 步骤3:将该套接字设置为被动模式(被动套接字);
  • 步骤4:从该套接字上接受一个来自客户的连接请求,建立与该客户的连接;
  • 步骤5:构造响应,并按照应用协议将该响应通过所建立的连接发回给客户;
  • 步骤6:与客户完成交互之后,关闭所建立的连接,并返回步骤3以接受来自下一个客户的新的连接请求。

1.3.3 UDP客户端算法

  • 步骤1:找到期望通信的服务器套接字端点地址(IP地址+协议端口号);
  • 步骤2:创建本地客户端套接字;
  • 步骤3:为该套接字指明本地端点地址;
  • 步骤4:基于期望通信的服务器套接字端点地址,与服务器进行通信(发送请求与等待应答);
  • 步骤5:通信结束之后,关闭该套接字以释放与之相关的资源。

1.3.4 UDP服务器算法

  • 步骤1:找到期望通信的服务器套接字端点地址(IP地址+协议端口号);
  • 步骤2:创建本地客户端套接字;
  • 步骤3:为该套接字指明本地端点地址;
  • 步骤4:基于期望通信的服务器套接字端点地址,与服务器进行通信(发送请求与等待应答);
  • 步骤5:通信结束之后,关闭该套接字以释放与之相关的资源。

1.4 Socket的服务方式和类型

1.4.1 流式套接字(SOCK_STREAM)

  • 流式套接字提供面向连接的、可靠的数据传输服务,可以无差错地发送数据。传输数据可以是双向的字节流,即应用程序采用全双工方式,通过套接字同时传输和接收数据。
  • 应用程序可以通过流传递有序的、不重复的数据。所谓“有序”指数据包按发送顺序送达目的地址,所谓“不重复”指一个特定的数据包只能获取一次。
  • 在使用流式套接字传输数据之前,必须在数据的发送端和接收端之间建立连接。
  • 如果必须保证数据能够可靠地传送到目的地、并且数据量很大时,可以采用流式套接字传输数据。文件传输协议(FTP)即采用流式套接字传输数据。

1.4.2 数据报式套接字(SOCK_DGRAM)

  • 数据报式套接字提供无连接的、不可靠的数据传输服 务,数据包被独立发送,数据可能丢失或重复。
  • 在Internet通信域中,数据报套接字使用UDP数据报协议形成的进程间通路,具有UDP协议为上层所提供的服务的所有特点。
  • 一般用于轻载通信,并具有多播通信的能力。

1.4.3 两者的区别

1.4.4 原始套接字

  • 原始套接字是公开的套接字编程接口。
  • 原始式套接字允许对较低层次的协议(如IP、ICMP)直接访问,允许用户自定义IP数据包里面的很多设置,用于检验新协议的实现。
    • 原始套接字保存了数据包中的完整IP头;
    • 前面两种套接字只能接收和发送用户数据,IP包里面的标志位不允许自己定义;
    • 可以通过原始套接字对协议、网络、数据进行分析。
  • 原始套接字的用途
    • 发送自定义的IP 数据报
    • 发送ICMP 数据报
    • 网卡的侦听模式,监听网络上的数据包。
    • 伪装IP地址
    • 自定义协议的实现
posted on 2020-10-27 22:34  千丶颜  阅读(332)  评论(5编辑  收藏  举报