一,TCP与UDP的基本总结
TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP是面向连接的,提供可靠、顺序的传输,适用于需要高可靠性的应用,如网页浏览和文件传输。它通过重传机制和流量控制确保数据完整性。UDP是无连接的,速度快但不保证数据的可靠性和顺序,适用于对实时性要求高的应用,如视频流和在线游戏。TCP在数据传输前建立连接,进行数据确认和重传,而UDP则简单直接,不进行连接建立或确认。
二、何种情况下connect会阻塞
TCP 三次握手过程中:在客户端调用 connect() 函数后,TCP 连接的建立需要经过三次握手过程。在这个过程中,如果服务器没有响应或者响应延迟,客户端的 connect() 函数会一直阻塞等待直到连接建立成功或者超时。
非阻塞套接字设置:如果将套接字设置为非阻塞模式,即在调用 connect() 前通过 fcntl() 函数设置了 O_NONBLOCK 标志,那么 connect() 将会立即返回,无论连接是否建立成功。在这种情况下,可以通过 select()、poll() 或 epoll() 等函数来检查连接是否建立成功,或者设置超时时间来控制连接操作。调用read的时候不堵塞(read(套接字,数组,数组大小);
目标地址不可达或网络问题:如果目标地址不可达、网络问题或者服务器端未处于监听状态,connect() 也会阻塞等待直到超时。
连接队列已满:在客户端与服务器建立连接时,服务器会维护一个连接队列来接受客户端的连接请求。如果连接队列已满,客户端的 connect() 调用将会阻塞,直到服务器接受了新的连接或连接超时。
三、TCP连接特性--- 三次握手,四次挥手
自导自演协议
三次握手:
第一次握手:客户端发送连接请求
第二次握手:服务器回应收到客户端的连接请求,并且告诉客户端可以连接
第三次握手:客户端回应服务器我收到你让我能连接的消息了
开始连接
本次发送的序列号seq是上一次的确认号ack 本次发送的ack是上一次的seq+1
四次挥手:
第一次挥手:客户端发送断开连接请求
第二次挥手:服务器回应客户端收到了断开连接的请求,准备断开
第三次挥手:服务器回应客户端准备好了,可以断开
第四次挥手:客户端回应服务器收到可以断开的请求
开始断开
四、常见的服务器IO(发送数据+接收数据)模型
阻塞式IO模型(Blocking IO Model):在这种模型中,当应用程序调用IO操作时,它会被阻塞,直到操作完成并返回结果。这意味着在等待IO操作完成的同时,应用程序无法执行其他任务。这种模型最适合于对实时性要求不高的应用程序。
非阻塞式IO模型(Non-Blocking IO Model):在这种模型中,应用程序IO操作和多路复用的时候会会立即返回,而不会等待IO操作完成。如果操作没有立即完成,则应用程序将继续执行其他任务。应用程序需要重复执行轮询操作来检查IO操作是否完成。这种模型适用于需要高实时性的应用程序。
IO复用模型(IO Multiplexing Model):在这种模型中,应用程序使用非阻塞IO操作向多个socket发起请求,并使用select()或poll()等系统调用来等待其中任何一个socket上的IO操作完成。当某个socket上的IO操作完成时,应用程序会收到通知并处理相应的IO事件。这种模型适用于需要同时处理多个socket连接的应用程序。
异步IO模型(Asynchronous IO Model):在这种模型中,当应用程序发起IO操作时,它会立即返回,并继续执行其他任务。当IO操作完成时,应用程序会收到通知并处理相应的IO事件。这种模型适用于需要同时处理多个IO操作的高并发应用程序。