通信

  • 网络通信
    • 三次握手
    • 四次挥手
    • 为什么TCP连接需要三次握手,两次不可以吗?为什么?
    • TCP连接的特点
    • TCP流量控制-滑动窗口
    • TCP拥塞控制
    • TCP与UDP的区别
  • 进程和线程的区别
  • 进程间通信的7种方式
  • 同步异步通信

网络通信

位码即TCP标志位,有6种标示:
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
SYN(synchronous建立联机)
Sequence Number(顺序号码)
Acknowledge Number(确认号码)

三次握手


1、TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
2、TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
3、TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
4、TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
5、当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

四次挥手


1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3、客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

为什么TCP连接需要三次握手,两次不可以吗?为什么?

step1: A->B :你好,B
step2: B->A :收到,你好,A
B向A打招呼,A没有回应,B没有收到A的反馈,无法确认A是否收到B发送的数据。
step2: A->B :收到,B
前两次握手为了保证服务端能收到客户端的信息并能做出正确的响应,后两次握手为了保证客户端能够收到服务端的信息并能做出正确的响应。

TCP连接的特点

(1)面向连接:采用C/S模型
(2)全双工
(3)安全可靠:
①流量控制:解决接收方不能不及时处理数据的问题
②拥塞控制:解决因网络通信延迟带来的数据丢失问题
③差错控制:解决数据被破坏、重复、时序和丢失的问题
(4)基于字节流

TCP流量控制-滑动窗口

滑动窗口
滑动窗口(Sliding window)是一种流量控制技术,用来改善吞吐量问题。
TCP流量控制
流量控制:如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。流量控制策略就是控制发送者的发送速度,使得接收者来得及接收,达到不丢失分组的目的。流量控制是构成TCP可靠性的一方面。

主机A向主机B发送数据,开始双方确定的窗口值为400字节,这两个是前提条件。开始A发送了200字节,之后发生了分组丢失现象,B调整接受窗口大小为300字节。之后A又连续发送了300字节。此时A已经不能发送数据,需等待B的窗口信号。之后B调整窗口为100字节。接收到100字节数据后,调整窗口值为0,表示暂时不想接受数据。总共B调整了三次窗口大小,进行了三次流量控制。
假如,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwind=400的报文段,然而这个报文段在传送中丢失 了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。这样就死锁了。为了解决这种死锁状态,TCP为每个连接设有一个持续计时器。只 要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。

TCP拥塞控制

拥塞的概念:在某段时间,对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫拥塞。网络拥塞往往是由许多因素引起的,简单的提高节点处理机的速度或者扩大结点缓存的存储空间并不能解决拥塞问题。拥塞问题的是指往往是整个系统的各个部分不匹配,只有各个部分平衡了,问题才会得到解决。
拥塞控制:防止过多的数据注入到网络,导致网络中的路由器或链路过载。
流量控制和拥塞控制的区别:可以看出流量控制是一个端到端的问题,而拥塞控制是一个全局性问题,设计到所有的主机、所有的路由器。

1.慢开始:乘法增加
发送方维持一个拥塞窗口cwnd,大小取决于网络的拥塞程度,动态地在变化。发送窗口小于等于拥塞窗口,而发送窗口一定不能超过接收窗口。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就增大一些,以便把更多的分组发送出去。但是只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络的分组数。
开始时,如果发送大量数据包,容易导致网络中路由器缓冲空间耗尽,从而发生拥塞。所以新建连接时,cwnd初始化为1个最大报文段(MSS)大小,每经过一个迭代,拥塞窗口就乘以2,所以也称为乘法增加阶段。拥塞窗口不可能一直增大,所以一般会设置一个慢开始门限ssthresh.
当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,改用拥塞避免算法。

2.拥塞避免:加法增大
一旦达到慢开始的初始门限ssthresh,就进入了拥塞避免阶段。每一个迭代,拥塞窗口加1,而不是加一倍。

3.快重传
快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。快重传策略是为了防止TCP连接因等待重传计时器超时而空闲较长的时间。

4.快恢复
快重传和快恢复是搭配使用的,快重传完成后,立即执行快恢复算法。将ssthresh门限设置为当前拥塞窗口的一半,之后将拥塞窗口设置为新的ssthresh门限(即减半), 进入拥塞避免阶段。
应答超时:sstresh=cwnd/2
cwnd=1
快恢复的sstresh,cwnd设置要和应答超时区分开来。
这里可能会有人有疑问,为什么不直接进入慢开始阶段,更彻底得避免拥塞。主要的原因是考虑到如果网络出现拥塞得话,就不会收到多次重复确认,所以发送方认为网络可能没有出现拥塞,所以不执行慢开始算法,而是将cwnd设置为新得ssthresh门限,执行拥塞避免算法。

TCP与UDP的区别

TCP面向连接的, 传输数据时,需先进行三次握手,建立连接,UDP是无连接的,发送数据之前不需要建立连接
TCP通过确认和重传机制,提供可靠的服务。即通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达,而UDP不保证可靠传输,只是尽可能得交付
TCP面向字节流,即将数据看成一连串无结构的字节流。UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
适用场景:
TCP:当对网络通讯质量有要求时,比如HTTP、HTTPS、FTP等传输文件的协议, POP、SMTP等邮件传输的协议
UDP:对网络通讯质量要求不高时,要求网络通讯速度要快的场景

进程和线程的区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
说人话:开个QQ,开了一个进程;开了迅雷,开了一个进程。在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一个线程。所以一个进程管着多个线程。通俗的讲:“进程是爹妈,管着众多的线程儿子”。

进程间通信的7种方式

管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

同步异步通信

异步通信
异步通信中收发双方可以有各自自己的时钟,发送方发送的时间间隔可以不均,接收方并不知道数据什么时候会到达。接收方是在数据的起始位和停止位的帮助下实现信息同步的。这种传输通常是很小的分组。
同步通信
同步通信中双方使用频率一致的时钟 ,它的分组相比异步则大得多,称为一个数据帧。发送方要以固定的节奏去发送数据,而接收方要时刻做好接收数据的准备。通信效率高,更加适合对速度要求高的传输,当然这种通信对时序的要求也更高。同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息,由同步字符、数据字符和校验字符(CRC)组成。

同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
同步通信效率高;异步通信效率较低。
同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
同步通信可用于点对多点;异步通信只适用于点对点。

参考文章
TCP协议中的三次握手和四次挥手 图解、原因、状态码总结

【通信】网络通信 进程通信 同步异步通信相关推荐

  1. 线程通信和进程通信区别(线程进程区别)

    前言: 腾讯笔试中多道选择题考到这个问题,这里总结一下.学习Java的童鞋可能对于线程的理解要比学php好很多.本文参考于线程通信与进程通信的区别 . 进程和线程的区别: 对于进程来说,子进程是父进程 ...

  2. python管道通信_Python进程通信之匿名管道实例讲解

    匿名管道 管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么是输出端. os.pipe()返回2个文件描述符(r, w ...

  3. linux ipc通信,linux-IPC进程通信-UNIX Domain Socket IPC (sockaddr_un) (上)

    2011-05-11 15:28 7387人阅读 评论(1) 收藏 分类: C/C++(22) socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制(IPC:即 ...

  4. [Android]你不知道的Android进程化(4)--进程通信AIDL框架

    Google爸爸,听说要将一些插件化hook系统的变量属性禁用,Android P之后很可能将会不再有插件化.热更新.主题变换.资源加固等骚操作.试图hook,你将会看到 NoSuchFieldExc ...

  5. 计算机操作系统感悟随笔--进程通信

    一.进程通信是指进程之间的信息交换 1.低级通信--进程之间的互斥和同步 信号量机制是有效的同步工具,但作为通信工具缺点如下: (1)效率低(通信量少) (2)通信对用户不透明(程序员实现,操作系统只 ...

  6. 王道 —— 进程通信

    1.知识总览 进程通信:进程通信是指进程之间的信息交换: 进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立: 为了保证安全,一个进程不能直接访问另一个进程的地址空间: ...

  7. linux进程管道通信缺点,Linux进程通信(IPC)的方式详解

    前言:Linux进程通信的方式 什么是进程通信?进程通信是指进程之间交换信息 进程通信方式共有6种: 管道(pipe),包括流管道(s_pipe)和有名管道(named pipe) 信号(signal ...

  8. 单片机串口通信与同步异步通信

    文章目录 一.串口通信 二.异步通信 三.同步通信 四.串行通信的传输方向 一.串口通信 1.随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要.计算机通信是指计算机与外部 ...

  9. Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程

    内容: 同步锁 死锁.递归锁 信号量和同步对象(暂时了解即可) 队列------生产者和消费者模型 进程(基础使用.进程通信.进程池.回调函数) 协程 一.并发并行与同步异步的概念 1.1.并发和并行 ...

最新文章

  1. 推荐一个学习golang的地址
  2. python: ImportError:DLL load failed 解决方法。
  3. MVC 使用自定义HtmlHelper截断文本内容
  4. linux查看系统的日志的一些实用操作
  5. [css] 写出你遇到过IE6/7/8/9的BUG及解决方法
  6. 数据持化技术的发展演变(SQL、JDBC、mybatis)
  7. 基于JAVA+SpringMVC+MYSQL的学生信息管理系统
  8. com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
  9. 如何在虚拟机上安装TrueNAS系统
  10. 学车是学手动档好,还是学自动档好呢?另外建议自驾游选哪个档比较好呢?
  11. 【IT之路】LoadRunner系列-Loadrunner 11破解汉化
  12. 天勤数据结构代码——树基本操作
  13. 大学生河南旅游网页设计成品 学生网页作业我的家乡网页制作代码 静态HTML旅游网页设计作品下载
  14. android expandablelistview横向,ExPandableListView实现时间轴效果【Android】
  15. 数据治理系列4:主数据管理实施四部曲概论
  16. ipad创建id显示服务器失败,为什么无法创建苹果id什么原因
  17. 解决EPSON R230打印机驱动程序安装错误
  18. linux查看docker是否启动命令行,如何通过命令行查看docker服务是否已启动
  19. 文件包含漏洞—allow_url_fopen和allow_url_include详解
  20. kafka连接mysql数据库,Kafka-connect-jdbc-source连接mysql数据库实战

热门文章

  1. c++17 std::variant
  2. 【统计学01】概括性描述-集中趋势,离散程度,分布形状度量
  3. 信息化加速发展背景下全球化的新特征
  4. 我的助理辞职了(转)
  5. 一个实时显示系统时钟的android应用
  6. INSERT INTO SELECT 用法
  7. 【java框架】Thumbnails 图片处理--用法
  8. 查询MAC地址所属生产厂商
  9. mysql插入数据到多个表,MySQL插入多个表?(数据库规范化?)
  10. Spring事件发布与监听