一,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
四次挥手:
第一次挥手:客户端发送断开连接请求
第二次挥手:服务器回应客户端收到了断开连接的请求,准备断开
第三次挥手:服务器回应客户端准备好了,可以断开
第四次挥手:客户端回应服务器收到可以断开的请求
开始断开