运行在多个端系统上的程序是如何互相通信的?

一、进程通信

1.首先搞清楚一点,对于操作系统而言,进行通信的实际上是进程,而不是程序

2.一个进程可以被认为是运行在端系统上的一个程序,当多个进程运行在相同的端系统上的时候,它们使用进程间通信机制相互通信。对于进程间的通信规则由端系统上的操作系统确定。(对于进程间通信的方式查阅历史博客)

3.在两个不同端系统上的进程,通过跨越计算机网络相互交换报文而相互通信,具体而言,这两个进程可以通过网络接口进行通信,例如以太网接口、无线局域网接口等。

1.1 客户和服务器进程

        在一组进程之间的通信会话场景中,发起通信的进程会被标识为客户(client),在会话开始时等待联系的进程被标识为服务器(server)。

1.2 进程与计算机网络之间的接口

        我们知道,对于一个端系统上的两个进程之间相互通信的话,有相应的进程间通信机制。但对于不同端系统上的进程实现相互通信的话就需要通过网络接口(套接字);

套接字:同一个主机内应用层与运输层之间的接口,由于套接字是建立在网络应用层的可编程接口,因此,套接字也被称为应用程序与网络之间的应用程序编程接口(API);

套接字提供了一系列方法,如bind、listen、accept、connect、send、receive等,用于实现网络通信。例如,bind方法用于将套接字绑定到一个地址和端口,listen方法用于监听来自客户端的连接请求,accept方法用于接受客户端的连接请求并返回一个新的套接字对象,用于与客户端进行通信。

 对于套接字而言,它是应用层与运输层之间的接口,而对于应用程序开发者而言,可以控制套接字在应用层端的一切,但对该套接字运输层端几乎没有控制权。那么应用程序开发者对于运输层的控制仅限于以下两点:(1)选择的运输协议;(2)运输的参数,如最大缓存、最大报文段的长度等

1.3进程寻址

        为了向特定目的地发送邮件,需要知道目的地的地址,那么进程间相互通信也是如此,需要两个信息:(1)主机的地址(IP地址);(2)在目的主机中指定接收进程的标识符(端口号);

IP地址和端口号的作用:

P地址和端口号是网络通信中用来标识网络连接的两个重要信息

  1. IP地址:IP地址用于标识网络上不同的计算机或设备,它是网络通信中确定主机位置的关键。IP地址由四个字节组成,通常表示为xxx.xxx.xxx.xxx的形式,如192.168.1.1。IP地址可以区分不同的子网,从而实现网络分段和隔离。
  2. 端口号:端口号用于标识网络连接中的不同应用程序,它是网络通信中确定通信目标的关键。端口号由两个字节组成,通常表示为xxxx的形式,如80(HTTP服务)或22(SSH服务)。端口号可以区分不同的应用程序和服务,从而实现网络通信的隔离和隔离。

二、可供应用程序使用的运输服务 

2.1可靠数据传输

可靠传输协议:可靠传输协议是一种更高级的数据传输方式,它通过定义一组标准的方法和协议来实现数据传输的可靠性和一致性。常见的可靠传输协议包括TCP、UDP、QUIC等。这些协议通过提供一系列可靠性功能,如重传、超时、流量控制等,来保证数据传输的可靠性和一致性。

2.1.1TCP

(1)TCP的原理:
  1. 建立连接:在TCP中,建立连接需要进行三次握手。首先,发送方会向接收方发送一个SYN(同步)报文,表示它要开始建立连接。接着,接收方会回复一个SYN-ACK(同步确认)报文,表示它已经收到了发送方的SYN报文,并且准备开始建立连接。最后,发送方会再次向接收方发送一个ACK(确认)报文,表示它已经收到了接收方的SYN-ACK报文,从而完成三次握手,建立了连接。
  2. 传输数据:在建立了连接后,发送方会向接收方发送数据包,数据包中包含应用程序的数据。接收方在收到数据包后,会将其添加到接收缓冲区中,并发送一个ACK报文给发送方,表示它已经接收到了数据包。发送方在收到ACK报文后,会将该数据包从发送缓冲区中移除,从而继续发送下一个数据包。
  3. 断开连接:在传输数据完成后,发送方会向接收方发送一个FIN(结束)报文,表示它要断开连接。接着,接收方会收到一个ACK报文,表示它已经收到了发送方的FIN报文,从而确认连接已经断开。最后,发送方会再次向接收方发送一个FIN报文,表示它也要断开连接。接收方在收到FIN报文后,会发送一个ACK报文给发送方,表示它已经接收到了FIN报文,从而完成断开连接的流程。
  4. 重传机制:在传输数据过程中,如果数据包出现问题时,TCP会使用重传机制来重新传输数据包。重传机制包括快速重传和慢启动重传两种方式。快速重传是指在数据包丢失后,发送方会立即发送一个ACK报文给接收方,表示它已经接收到了数据包。慢启动重传是指在数据包丢失后,发送方会根据网络拥塞情况来控制发送的数据量,从而避免发送方发送过多数据而导致的网络拥塞。
(2)TCP的优缺点

优点:

  1. 可靠传输:TCP通过提供数据包的确认、重传和超时机制,来保证数据包的可靠传输。当发送方发送一个数据包后,它会等待接收方的确认,如果接收方没有确认该数据包,发送方会重新发送该数据包。TCP还提供了一种窗口控制机制,它允许接收方在接收数据时暂缓接收,从而避免发送方过多发送数据而导致的网络拥塞。
  2. 流量控制:TCP通过提供窗口控制机制,来控制发送方的发送速度,从而避免网络拥塞。当接收方告诉发送方它的接收窗口大小后,发送方会根据这个大小来控制发送的数据量,从而避免发送方发送过多数据而导致的网络拥塞。
  3. 可靠排序:TCP通过使用一个序列号来标识数据包的顺序,来保证数据的可靠排序。当发送方发送一个数据包后,它会等待接收方的确认,如果接收方没有确认该数据包,发送方会重新发送该数据包。

缺点:

  1. 慢启动:TCP在传输数据时,会使用一个慢启动机制,来避免网络拥塞。在传输开始时,发送方会根据网络拥塞情况来控制发送的数据量,从而避免发送方发送过多数据而导致的网络拥塞。这种慢启动机制可能会导致数据传输速度相对较低。
  2. 数据重传:当数据包在传输过程中出现问题时,TCP会使用重传机制来重新传输数据包。这种重传机制可能会导致数据传输速度相对较低,并且可能会增加网络延迟。
  3. 数据排序:TCP通过使用一个序列号来标识数据包的顺序,来保证数据的可靠排序。但是,这种排序可能会导致数据传输速度相对较低,并且可能会增加网络延迟。

2.2.2 UDP 

UDP(用户数据报协议)是一种简单的不可靠传输协议,它不提供数据包的确认、重传和超时机制,因此它的可靠性相对较低。

(1)UDP的原理:
  1. 建立连接:在UDP中,不需要进行连接建立的过程,数据包可以直接发送。发送方会直接将数据包发送到接收方的地址和端口,而接收方则需要自己绑定一个端口来接收数据包。
  2. 传输数据:在建立了连接后,发送方会向接收方发送数据包,数据包中包含应用程序的数据。接收方在收到数据包后,会将该数据包添加到接收缓冲区中,并立即向发送方发送一个ACK报文,表示它已经接收到了数据包。发送方在收到ACK报文后,会将该数据包从发送缓冲区中移除,从而继续发送下一个数据包。
  3. 断开连接:在传输数据完成后,不需要进行连接的断开过程,数据包可以直接发送。发送方会继续向接收方发送数据包,而接收方则会根据自己缓冲区的大小来暂缓接收数据包,从而避免网络拥塞。
(2)优缺点 

优点:

  1. 简单易用:UDP不需要进行连接建立的过程,数据包可以直接发送,因此简单易用。
  2. 快速传输:UDP不提供重传机制,因此它的传输速度相对较快。
  3. 低延时:UDP不提供超时机制,因此它的网络延迟相对较低。

缺点:

  1. 可靠性低:UDP不提供数据包的确认、重传和超时机制,因此它的可靠性相对较低,可能会导致数据丢失。
  2. 无法保证数据顺序:UDP不提供数据包的顺序保证,因此它的数据顺序无法保证。
  3. 无法保证数据完整性:UDP不提供数据包的确认机制,因此它的数据完整性无法保证。

2.2.3 TCP与UDP的区别 

  1. 可靠性:TCP提供数据包的确认、重传和超时机制,因此它的可靠性相对较高,可以保证数据的完整性和一致性。而UDP不提供数据包的确认、重传和超时机制,因此它的可靠性相对较低。
  2. 传输速度:TCP提供窗口控制机制,可以控制发送方的发送速度,因此它的传输速度相对较低,但是可以保证数据的完整性和一致性。而UDP不提供窗口控制机制,因此它的传输速度相对较快,但是无法保证数据的完整性和一致性。
  3. 数据顺序:TCP提供数据包的顺序保证,因此它的数据顺序可以保证。而UDP不提供数据包的顺序保证,因此它的数据顺序无法保证。
  4. 数据完整性:TCP提供数据包的确认机制,因此它的数据完整性可以保证。而UDP不提供数据包的确认机制,因此它的数据完整性无法保证。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 05:12:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 05:12:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 05:12:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 05:12:02       20 阅读

热门阅读

  1. HTML基础

    2023-12-07 05:12:02       38 阅读
  2. CentOS配置本地源

    2023-12-07 05:12:02       29 阅读
  3. Tensorflow.js 入门学习指南

    2023-12-07 05:12:02       36 阅读
  4. Android 10.0 关闭相机开始录像时的快门声音

    2023-12-07 05:12:02       34 阅读
  5. Python Flask 框架开发

    2023-12-07 05:12:02       40 阅读
  6. 大数据生态架构:探索未来科技的无限可能。

    2023-12-07 05:12:02       40 阅读
  7. PyQt学习随笔:QListWidget的addItem方法 Python

    2023-12-07 05:12:02       41 阅读
  8. python进行文件批量命名

    2023-12-07 05:12:02       37 阅读