TCP和UDP的大致区别在于,TCP是面向连接的,只有建连接后才进行传输,而UDP是无连接的,直接进行数据传输。
基于socket的TCP和UDP大致示意图
TCP流程,三次握手和四次挥手
在socket编程中,TCP的大致流程是,服务端和客户端各自创建socket,服务端通过bind绑定端口,通过listen监听客户请求,然后客户端发起连接请求,经过三次握手建立连接,然后通过send和recv进行数据的传输。
TCP流程图
TCP包的几个重要的标记位是同步SYN(在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1),确认ACK(仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1),终止FIN(用来释放连接),两个序号分别是序号seq(表示报文的序号),确认号ack(是期望收到对方下一个报文的第一个数据字节的序号)。
其中,建立连接是一个三次握手的过程。第一次,客户端发送一个TCP包,SYN标记为客户端的初始化序号。第二次,服务端返回一个TCP包,SYN标记为服务端的初始化序号,ACK标记为客户端的初始化序号+1。第三次,客户端返回一个TCP包,ACK位标记为服务端的初始化序号+1。自此,连接完成建立。
三次握手示意图
断开连接是一个四次挥手的过程,既可以是客户端中断连接也可以是服务端中断连接。以客户端为例,第一次,客户端发送一个TCP包,FIN标记为1,序列号seq为前面已传输过来数据的最后一个字节的序号+1,客户端进入FIN-WAIT-1状态。第二次,服务端发送一个TCP包,ACK标记为之前的seq+1,当前seq置为服务端的序列号,服务端进入CLOSE-WAIT状态,客户端收到后,进入FIN-WAIT-2状态,同时继续传输数据。第三次,服务端发送完所有需要发送的数据后,发送一个TCP包,FIN和ACK置为1,seq为当前服务器序列号w,ack依然为之前的seq+1,此时服务端进入LAST-ACK状态。第四次,客户端发送确认请求的TCP包,ACK标记之前的seq+1,seq为之前的ack+1,服务端收到后立刻关闭连接,客户端等待2MSL(Maximum Segment Lifetime)后也关闭连接。
四次挥手示意图
TCP流量控制和拥塞控制
TCP除了连接本身的可靠性以外,还提供了数据传输的流量控制,从而避免拥塞。
流量控制利用滑动窗口实现,接收方每次响应发送方时,更新窗口值rwnd,发送方发送数据不得超过窗口值。
拥塞就是对资源的需求超过了可用的资源。为了避免拥塞,我们要进行拥塞控制,基于发送方的窗口cwnd值来进行,即防止过多的数据注入到网络中。拥塞控制基于流量控制,即减少发送数据的速度(频率),来实现。常见的拥塞控制有满开始、拥塞避免、快重传和快恢复。
-
慢开始
由小到大逐渐增大拥塞窗口,例如每一轮翻倍。 -
拥塞避免
窗口大小到一定值以后进行加法增大,而非指数(翻倍)增大。 -
快重传
接收方未收到一个信息时,立即重复确认上一个正确收到的信息,从而立即获得重传,而不是等待重传计时器。 -
快恢复
发送方连续收到三个重复确认,乘法减小窗口,加法增大窗口,而非重新回到0进行慢开始。
TCP的设计原因
-
为什么要三次握手?
如果只有两次握手,之前因网络延迟残留的数据包会重新被服务端接收,并依此建立额外的连接。 -
第三次握手失败怎么办?
客户端第三次发送的TCP包未能到达服务端,则服务端直接想客户端发送RTS包并关闭连接,等待下一次重新连接。主要为了防范伪造很多IP向服务端发送连接请求,导致服务端资源浪费。 -
如何防范大量伪连接请求造成的攻击?
3.1. 缩短等待超时时间,即SYN_TIMEOUT时间,但过低会造成难以正常建立连接。
3.2. SYN cookie,服务端不立即分配资源,而是将客户端发来的包计算一个cookie值,等待第三次握手确认后进行校验,再分配资源。
3.3. SYN proxy代理,用代理服务器和客户端进行三次握手,成功建立连接后服务端通过代理和客户端建立连接。 -
为什么要四次挥手
4.1. 确认被断开方收到了断开请求,避免重复传送。
4.2. 被断开方即时提醒传输的完成,保证数据传输的可靠完成。
UDP流程
和TCP相比,UDP不用建立连接,直接通过Sendto和recvfrom进行数据传输,不考虑连接建立与否、消息送达与否的以及消息传送顺序的校验。
UDP流程图
TCP和UDP的比较
TCP优缺点:
- 可以显示地创建和终止连接
- 保证可靠有序不重复的数据传输
- 流量控制和拥塞控制
- 数据传输失败可以识别并处理
- 创建、维持连接以及流量控制有额外开销
UDP优缺点:
- 不保持连接
- 没有反馈和重传机制
- 用于短消息和控制消息
- 对带宽的要求小
参考
基于 Socket 的 UDP 和 TCP 编程介绍
TCP:三次握手,URG、ACK、PSH、RST、SYN、FIN 含义
TCP协议中的三次握手和四次挥手(图解)
TCP的三次握手与四次挥手(详解+动图)
TCP流量控制
TCP的拥塞控制
网友评论