TCP和UDP的区别

  • TCP是面向连接的,UDP是面向无连接的。
  • UDP程序结构较为简单。
  • TCP是面向字节流的,UDP是基于数据报的。
  • TCP保证数据正确性,UDP可能丢包。
  • TCP保证数据顺序,UDP不保证

什么是UDP

UDP的包头:

UDP 包头

  • 两个十六位的端口号,分别为源端口和目标端口。
  • 整个数据报文的长度。
  • 整个数据报文的校验和,该字段用于发现头部信息和数据中的错误。
UDP的特点
  • 沟通简单,不需要大量的数据结构、处理逻辑和包头字段
  • 不会建立连接,但是会监听这个地方,谁都可以传给它数据,它也可以传给任何人数据,甚至可以同时传给多个人。
  • 不会根据网络的情况进行拥塞控制,无论是否丢包都会一直发送

因此UDP在传输报文时是很高效的

什么是TCP

TCP的包头格式:

TCP 包头

  • 首先是源端口和目标端口
  • 接下来是包的序号,主要为了解决乱序问题
  • 确认序号,发出去的包应该有确认,这样能知道对方是否收到,如果没收到就应该重新发送,解决丢包的问题
  • 状态位。SYN是发起一个链接,ACK是回复,RST是重新连接,FIN是结束连接。因为TCP是面向连接的,因此需要双方维护连接的状态,这些状态位的包会引起双方的状态变更。
  • 窗口大小,TCP要做流量控制,需要通信双方各声明一个窗口,标记自己当前的处理能力
TCP的三次握手
  1. 主机A通过向主机B发送一个含有同步序列号标志位的数据段(SYN)给主机B,向主机B请求建立连接,通过这个数据段,主机A告诉主机B两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。

  2. 主机B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我。

  3. 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B的数据段

    这样三次握手就完成了,主机AB就可以传输数据了

TCP的四次挥手
  1. 当主机A完成数据传输后,将控制位FIN置为1,提出停止TCP连接的请求
  2. 主机B收到FIN后对其作出响应,确认这一方向的TCP连接将关闭,将ACK置为1
  3. 由主机B端再提出反方向的关闭请求,将FIN置为1
  4. 主机A对主机B的请求进行确认,将ACK置为1,双方向的关闭结束

TCP的三次握手目的是什么?为什么不用两次和四次?

TCP 三次握手的主要目的是防止失效的连接请求报文被服务端接受

如果只有两次握手,假设当客户端发送第一次连接请求由于网络拥塞的原因,迟迟未到服务端,客户端没接收到确认报文,认为服务端没有收到,于是重新发送请求报文并与服务端建立连接,等这次连接断开了,之前滞留的那个请求报文又到达了服务端,就会让服务端与客户端再次连接成功,这时服务端就会一直等待客户端发送请求,造成了资源的浪费。

两次握手只能保证单向链路是可以通信的,理论上来说,要保证双向链路可以通信需要四次握手,但实际上服务端给客户端的 SYN 和 ACK 数据包可以合为一次握手,所以实际上只需要三次握手即可。

挥手为什么需要四次?三次不行吗?

挥手阶段中服务端的 ACK 和 FIN 数据包不能合为一次。因为挥手阶段的流程为客户端发送FIN数据包表示自己发完了,服务端立即回复 ACK 数据包表示自己知道了,此时客户端到服务端的连接已经释放了,客户端不会再发送数据了,但服务端还可以继续向客户端发送数据,等到服务端也完成了数据发送,才会发送 FIN,这时客户端回复 ACK,就可以结束通信了。

TCP 在四次挥手的过程中为什么客户端最后还要等待 2MSL(Maximum Segment Lifetime)?

因为客户端要保证他的 ACK 包顺利到达服务端,如果客户端的ACK数据包丢失,则服务端或重新发送 FIN 包到客户端,而这两个过程的最长时间为 1MSL,加起来为 2MSL,如果 2MSL 后客户端还没有收到服务端重发的 FIN 包,则说明 ACK 包顺利到达,可以关闭连接了。