Socket网络通信详解

Socket网络通信系列文章目录

带你了解什么是Socket? 网络中进程之间如何通信;关于Socket的TCP/IP协议,UDP协议;

进程是程序的一次动态执行过程。用户运行程序就产生了进程,用户关闭程序就结束了进程。一个程序可以产生多个进程,但一个进程只能由一个程序产生。

线程是程序执行中一个单一的顺序控制流是程序执行流的最小单元,是处理器调度和分派的基本单位,是进程中代码的不同执行路线,一个进程可以有多个线程。

文章目录

  • 系列文章目录
  • 前言
  • 一、认识Socket,Socket是什么?
    • 1.Socket是什么?
    • 2.Socket的基本操作
  • 二、网络中进程之间如何通信;
    • 1.本地进程通信方式
    • 2.网络进程是如何通信的
  • 关于Socket的TCP/IP协议,UDP协议;
    • 1.TCP/IP,UDP 协议的特点
    • 2.TCP/IP协议的三次握手,四次挥手
    • 3.关于Socket的TCP/IP协议,UDP协议


前言


一、Socket是什么?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口

在设计模式中,Socket是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

二、网络中进程之间如何通信

1.本地进程通信方式

本地的进程间通信(IPC)有很多种方式,可以分为4类:

  • 消息传递(管道、FIFO、消息队列)
  • 同步机制(互斥量、条件变量、读写锁、文件和写记录锁、信号量)
  • 共享内存(匿名的和具名的)
  • 远程过程调用(Solaris门和Sun RPC)

(1.1)管道:管道不是进程的资源,属于操作系统的,两个进程通过操作系统提供的内存空间进行通信。

(1.2)命名管道(FIFO)

(1.3)消息队列(Message Queue)

(2.1)互斥量(Mutex)

(2.2)条件变量(Condition Variable)

(2.3)读写锁(Read-Write Lock)

(2.4)信号量(Semaphore)

(3) 共享内存

2.进程是如何通信的

1)管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。

2)有名管道(FIFO):有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,管道是先进先出的通信方式。

3)信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

4)消息队列:消息队列是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

5)信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

6)共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
7)套接字( socket ) :套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

多线程如何同步的:

1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2)互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
3)信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

4)事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .

总结:
  1) 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
  2) 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
  3) 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。


三、关于Socket的TCP/IP协议,UDP协议; 

提示:这里对文章进行总结:

TCP/IP 的三次握手:

  • 客户端向服务器发送一个SYN  J
  • 服务器向客户端响应一个SYN  K,并对SYN  J进行确认ACK  J+1
  • 客户端再想服务器发一个确认ACK  K+1

        当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

TCP/IP 的四次挥手:

1. 解释一下TCP和UDP的主要区别,并说明它们各自适用的场景。

  • TCP(传输控制协议)是面向连接的、可靠的、基于字节流的传输层通信协议。它提供了数据确认、数据重传、流量控制、拥塞控制等机制,确保数据正确、顺序、完整地到达接收方。适用于需要高可靠性的场景,如文件传输、Web服务等。
  • UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。它不提供数据可靠性保证,不建立连接,不保证数据包的顺序和完整性,但传输速度快,适用于对实时性要求高且能容忍一定数据丢失的场景,如视频流、DNS查询等。

2. 描述一下TCP三次握手和四次挥手的过程。

  • 三次握手
    1. 客户端发送SYN(同步序列编号)包到服务器,并进入SYN_SENT状态,等待服务器确认。
    2. 服务器收到SYN包后,确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN_RCVD状态。
    3. 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(连接建立)状态,完成三次握手。
  • 为什么需要三次握手?:两次握手无法确保双方接收和发送能力都正常。通过三次握手,双方都能确认对方的接收和发送能力正常,从而建立起可靠的连接。
  • ISN是固定的吗?:ISN不是固定的,而是随时间动态生成的。这是为了防止在网络中被延迟的分组在以后又被传送,导致错误。
  • SYN报文是否可以携带数据?:第一次握手时,SYN报文不能携带数据,但第三次握手时ACK报文可以携带数据。

  • 四次挥手
    1. 客户端发送一个FIN,用来关闭客户端到服务器的数据传送。客户端进入FIN_WAIT_1状态
    2. 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态
    3. 服务器关闭与客户端的连接,发送一个FIN给客户端。服务器进入LAST_ACK状态
    4. 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。客户端进入TIME_WAIT状态,等待一段时间后(通常是2MSL,即最大报文生存时间的两倍),再关闭连接。服务器收到ACK报文后,进入CLOSED状态,连接关闭
  • 目的:四次挥手的主要目的是确保客户端和服务器都能正常关闭连接,并释放资源。
  • 问题点

  • 为什么需要四次挥手?:TCP连接是全双工的,即数据可以同时在两个方向上传输。因此,需要四次挥手来确保双方都能正常关闭连接。
  • TIME_WAIT状态的作用是什么?:TIME_WAIT状态用于确保客户端发送的最后一个ACK报文能够被服务器接收到。如果服务器没有收到ACK报文,可能会重新发送FIN报文,此时客户端需要在TIME_WAIT状态下等待并重新发送ACK报文。
  • MSL是什么?:MSL(Maximum Segment Lifetime)是报文在网络上存在的最长时间,超过这个时间报文将被丢弃。TIME_WAIT状态的时间通常设置为2MSL,以确保连接被彻底关闭。

3. 在C++中,如何使用Socket进行TCP网络通信?

  • 创建Socket:使用socket()函数。
  • 绑定Socket到特定IP和端口:使用bind()函数。
  • 监听连接请求(服务器):使用listen()函数。
  • 接受连接(服务器):使用accept()函数。
  • 发送和接收数据:使用send()write()发送数据,recv()read()接收数据。
  • 关闭连接:使用close()函数。

4. 谈谈Socket编程中可能出现的异常或问题,以及如何解决?

  • 连接超时:设置超时时间,使用setsockopt()函数调整。
  • 阻塞与非阻塞:根据需求选择合适的Socket模式,非阻塞模式通过轮询或IO多路复用(如select、poll、epoll)来处理。
  • 缓冲区溢出:合理设置Socket缓冲区大小,及时读取数据。
  • 网络异常中断:增加重连机制,捕获异常并处理。
  • 数据粘包和拆包:采用定长、分隔符、包头+包体长度等方式解决。

5. 解释一下TCP的流量控制和拥塞控制机制。

  • 流量控制:主要通过滑动窗口机制来控制发送方的发送速率,确保接收方能够及时处理收到的数据。
  • 拥塞控制:用于防止过多的数据注入到网络中,使网络中的路由器或链路不致过载。主要策略包括慢开始、拥塞避免、快重传和快恢复。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值