[杂学笔记]TCP的三次握手与四次挥手、SYN洪水、TCP可靠性传输的体现、如何解决死锁问题、数组和队列的区别与优势、进程间通信的方式、为什么视频音频适合用UDP协议

目录

1.TCP的三次握手与四次挥手

三次握手

四次挥手

2.SYN洪水

3.TCP可靠性传输的体现

4.如何解决死锁

5.数组和队列的区别与优势

6.进程间通信的方式

7.视频音频适用于UDP协议


1.TCP的三次握手与四次挥手

三次握手

        客户端会先发送SYN请求与服务端建立连接,服务端收到之后,会发送SYN+ACK响应报文,告诉客户端我可以和你建立连接,之后客户端就单方面建立了连接,之后发送ACK响应告诉服务端我收到了你的响应,当服务端接收到客户端发来的ACK响应报文之后,才会真正的建立连接。

        三次握手除了建立连接之外,会沟通对端窗口的大小,沟通起始序号以及最大报文长度。

        对应到接口上,双方都创建好了网络套接字之后,客户端的connect负责发起三次握手,经历三次握手之后,服务端会创建一个结构体对象放入到全连接队列当中,accept就是负责将这些对象取出来和文件描述符建立连接。

四次挥手

        当客户端想要断开连接的时候,会先向服务端发送FIN请求,告诉服务端我要关闭连接了,之后服务端发送ACK响应报文告诉客户端我知道了。然后等待服务端将消息发送处理完毕之后,会像客户端发送FIN请求,告诉客户端我也可以关闭了,客户端收到之后,会发送ACK报文,服务端接收到之后就会关闭连接了。

        但是客户端会在一段时间内处于TIMEWAIT状态,等待没有到达的报文,以及如果是说最后一个ACK报文丢失了的话,还可以重新发送。

2.SYN洪水

        在TCP三次握手的第二次握手阶段后,处于半连接状态,就是客户端已经建立连接了,但是服务器还没有建立连接,他需要接收到第三次握手的ACK响应报文之后才会建立连接,那么在此之前就需要保存这些半连接,所以就有一个半连接队列。当恶意攻击的时候,发送大量的SYN请求,将半连接队列打满了,但是还不发送第三次ACK响应报文,那么半连接队列永远是满的,其他客户端和服务端建立连接了,就是SYN洪水。

3.TCP可靠性传输的体现

  • 确认应答机制:TCP报文中其中一个分类就是ACK响应报文,该报文中的32位确认序号就代表的是在这些序号之前的报文都收到了。如果有丢包的情况,连续的ACK应答报文的确认序号会是一样的,就告诉了服务端需要从该序号开始重新发送报文了。
  • 超时重传机制:如果说最后一个报文丢了的话,对端是不知道的,所以就不会有最后一个报文的应答,在一段时间后没有收到应答的话,就会重新发送该报文的。
  • 流量控制机制:当对端的接收缓冲区满了的时候,发送再多的报文对端也接收不了,也就不会发送了,这个机制基于的是TCP报文的16位窗口大小字段,该字段就是代表了对端的接收能力。
  • 拥塞控制机制:当网络状况不好的时候,TCP也会去检测是对端的接收问题还是网络问题,如果是网络问题的话,发送更多的报文会加剧网络拥堵,会采用探测报文以及慢启动的方式向对端再次发送报文。
  • 校验和可以确定TCP报文是否准确,32位序号可以将接收的无序报文重新排列起来。
  • 连接管理机制:拥有全连接队列和半连接队列,对于到来的连接会管理起来,如果当时无法处理的话,也可以过段时间之后在处理。

4.如何解决死锁

        死锁产生的四个条件:互斥条件、请求与保持、不可抢占、循环等待。解决死锁问题,就是破坏这四个条件之一就可以了。

  • 互斥条件是多个线程在同一时间只能由一个线程得到公共资源,这里的公共资源是锁,破坏该条件的话,就是不用锁。
  • 当请求锁失败的时候,将自己占有的锁资源也释放掉。
  • 设置优先级,优先级高的可以强行抢占优先级低的线程锁资源。
  • 每个线程都按照相同的顺序申请锁资源。先申请A,后申请B,那么申请不到A的就会等待A资源,而不是去申请B资源。

5.数组和队列的区别与优势

  • 数组:最大的优势在于支持下标的随机访问,简单易用,可以访问任何位置。
  • 队列:只能访问到队列的头部和尾部。在特定的场景下,例如CPU的调度队列先到来的先调度这种先进先出的场景下非常有优势,如果是数组的话,对于头删需要去移动数据。而且支持并发操作,可以同一时间,一个线程取出数据,另一个线程放入数据。

6.进程间通信的方式

  • 匿名管道:匿名管道是操作系统在内存中帮我们找到的一块空间,用于实现单方面的通信,但是只适用于有血缘关系的进程之间通信,因为匿名管道是通过创建两个文件描述符指向同一个文件,让子进程继承文件描述符之后才能访问到那块内存空间,进行父子进程之间的沟通。如果说没有血缘关系的话,是无法找到那块临时的内存空间的。
  • 命令管道:是一种特殊的文件,提供了进程之间的通信机制。和匿名管道最大的区别在于可以让没有关系的两个进程之间进行通信。
  • 共享内存:管道是复用了文件系统的代码,而共享内存是OS单独设计用于进程之间通信的模块。进程创建共享内存的时候,OS会在内存中单独申请一块区域作为进程之间通信的空间,同时映射到虚拟地址空间的共享区内。共享内存没有任何的同步机制,需要配合管道来实现共享内存的同步机制。
  • 消息队列:和共享内存机制一样,是在内存中维护了一块空间,只不过采用的是队列的结构,共享内存没办法通信的多条信息分开,而队列的结构可以将写入的多条信息分隔开。
  • 信号量:本质是一个计数器,用于保护临界资源,控制多个进程对共享资源的访问。
  • 套接字:网络通信也是不同进程之间的通信。

7.视频音频适用于UDP协议

        实时性、对数据丢失的不敏感、避免TCP的拥塞控制对实时性的影响

        视频音频的实时性很高,例如在视频通话或者直播的时候,更需要展现的是对方或者主播当前所说所做的画面。而且UDP报头只有8个字节,比TCP报头少了至少12个字节,这使得UDP在传输数据的时候开销比较小,传输数据的效率高一些。还不用建立连接。如果说因为建立连接、重传等操作导致延迟过大的话,会影响用户体验。

       视频的一帧画面的部分像素丢失,或者说语音中的短暂杂音,在一定程度上都不会影响整体的理解和感受。而且TCP有拥塞控制机制,当网络拥塞的时候,会降低发送报文的频率,那么就会严重的影响实时性了。让TCP协议的通信去参与网络疏导,UDP这种需要实时性的就别去管网络拥堵问题了。

你可能感兴趣的:(笔记,tcp/ip,网络,开发语言,音视频)