你所不知道的UDP与TCP

442 阅读5分钟

计算机网络将网络共分为五层:物理层,数据链路层,网络层,运输层以及应用层。TCP和UDP是运输层上两个重要的协议。许多应用层上的协议都是依赖这两个协议,因此弄明白TCP和UDP还是比较必要的。

UDP:用户数据报协议

他的特点就是速度快,无需建立连接,没有连接状态,并且首部字段的开销小。

  • 速度快:没有三次握手,拥塞控制等额外的开销。一有数据就会直接发送。

  • 无需建立连接:服务器与客户端无需建立连接就可以发送数据。

  • 没有连接状态:不会像TCP一样维护发送缓存接收缓存,拥塞控制,流量控制等连接状态。

  • 首部字段开销小:首部字段包括源端口号,目的端口号,长度以及校验和共8个字节。其中,校验和用于在一定程序上保证传输的准确性。校验和的实现思路:发送端对源端口号 + 目的端口号 + 长度 并进行取反,那么在接收端通过校验和 + 源端口号 + 目的端口号 + 长度的最终结果是否全为1来判断数据是否发生改变。虽然说UDP存在校验和,但它并不能保证数据的准确传输,也没有对数据传输的差错恢复能力以及重传机制。

TCP:传输控制协议

与UDP不同,TCP是面向连接的协议,TCP的头部共占20个字节。TCP在进行数据传输前要先进行连接,就是三次握手。

首先客户端像服务器发送特殊的不包含任何数据的SYN报文段,服务器在收到后对客户端返回SYN + ACK报文段告诉客户端我已经收到你的数据并同意进行连接,此时服务端会分配socket套接字等资源。当客户端收到该报文段后向服务器发送ACK报文段,告诉服务端我已经收到了你发送过来的消息并同意建立连接。此时连接建立可以发送数据。

当数据发送完毕需要关闭连接时,需要进行四次挥手。

首先客户端向服务器发送FIN报文段,当服务端收到FIN报文段时向客户端返回ACK报文段。此时,服务端再向客户端发送FIN报文段表示我也要关闭连接了,当客户端收到FIN报文段时向服务器返回ACK报文段。

  • 但是在这个过程中,客户端在发送ACK报文段后需要等待2MSL(一条消息能够在网络中存在的最长时间)的时间再关闭socket连接。原因:客户端发给服务端的ACK报文可能丢失,此时服务端需要重发FIN报文。*

TCP的一些其他特性:

  1. 传输的有效性:TCP是通过序号和确认号来保证传输的有效性,TCP会对报文进行拆分,而序号就是被拆分报文的编号,而确认号就是我希望下次收到的报文的序号。TCP通过一问一答的形式来保证传输的有效性。但是,这样的性能肯定是不高的,所以在TCP中引入了窗口的概念,即在一个窗口下,所有的报文无需等待回复就可以进行直接发送,这也就是所说的传输控制。

  2. 流量控制:因为TCP是全双工的协议,所以没有部分既可以作为发送端也可以作为接收端。在接受端和发送端中分别存在接受缓存和发送缓存。当消息到达接受端后并不会立马进行处理,而是等待操作系统分配时间片,等操作系统空闲了在进行处理。在发送端会定期向接收端发送一个窗口探测包,接收端接受到后来告诉发送端数据发送的频率。

  3. 拥塞控制:拥塞控制主要包括三部分,分别是慢启动,拥塞避免以及快速恢复。当开始发送数据时,先发送一个报文段,此后所发送的报文段进行指数增长,如果判断为网络拥堵则发送报文段的个数变为原来的一半。此时,进入拥塞控制状态,在拥塞控制状态下,所发送的报文段一次增加1,当再次网络拥堵时,则进入快速恢复状态,此时,所发送的数据量变为原来的一半,再依次以1为步长进行增长。如果此时还是网络拥堵,那么则转为慢启动状态。

网络拥堵的判断:发送方连续接收到三次冗余的确认号。

TCP的其他问题:SYN洪泛攻击

在进行三次握手时,如果服务器在接受到客户端的SYN报文段并向客户端发送SYN+ACK报文段后,此时服务器已经分配了socket套接字资源,而此时如果客户端没有向服务器返回ACK确认报文段,此时服务器就会处于一个半连接的状态。如果短时间内服务器收到非常多类似的报文,就会造成服务器开销过大。

解决方法:使用syn cookie,即当服务器手段syn报文段后并不立即分配资源,而是通过源端口号目的端口号,源IP地址目的IP地址形成一个序列号将这个序列号发送给客户端,如果不是攻击者就会返回ACK报文,此时服务器分配资源。如果是攻击者就不会返回ACK报文。