TCP和UDP的不同之处 tcp和udp概念和区别

写了这么多篇关于 TCP 和 UDP 的文章,还没有好好聊过这两个协议的区别,这篇文章我们就来开诚布公的谈一谈 。
关于 TCP 和 UDP ,想必大家都看过一张这样的图 。

TCP和UDP的不同之处 tcp和udp概念和区别


有一个小姑娘在对着瓶口慢慢的喝水,下面写着可靠的传输,少女的衣服没有被水浸湿,这张图被称为 TCP。
然后又有一个小姑娘在举着水瓶以很快的速度向下倒水,少女的头发凌乱,脸色泛红,衣服也被水浸湿,这张图被称为 UDP。
这两张图我认为是个程序员都能大致总结出来这两个传输协议的不同点(毕竟图上都写的很清楚了)甚至不少同学对 UDP 产生了邪恶的念想,你说作者好好的画个图不行吗,非要在脸上挂个红,把衣服弄湿了才行 。。。。。。。
咳,咱们言归正传,TCP 和 UDP 的区别一直是面试的重点,也是经常被用来拿来各种比较的两个协议 。
建立连接的差异TCP 建立连接需要经过三次握手,同时 TCP 断开连接需要经过四次挥手,这也表示 TCP 是一种面向连接的协议,这个连接不是用一条网线或者一个管道把两个通信双方绑在一起,而是建立一条虚拟通信管道 。
TCP 的三次握手流程(客户端向服务器发送建立连接请求):
TCP和UDP的不同之处 tcp和udp概念和区别


  1. 服务端进程准备好接收来自外部的 TCP 连接,一般情况下是调用 bind、listen、socket 三个函数完成 。这种打开方式被认为是 被动打开(passive open) 。然后服务端进程处于 LISTEN 状态,等待客户端连接请求 。
  2. 客户端通过 connect 发起主动打开(active open),向服务器发出连接请求,请求中首部同步位 SYN = 1,同时选择一个初始序号 sequence ,简写 seq = x 。SYN 报文段不允许携带数据,只消耗一个序号 。此时,客户端进入 SYN-SEND 状态 。
  3. 服务器收到客户端连接后,需要确认客户端的报文段 。在确认报文段中,把 SYN 和 ACK 位都置为 1。确认号是 ack = x + 1,同时也为自己选择一个初始序号 seq = y 。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号 。此时,TCP 服务器进入 SYN-RECEIVED(同步收到) 状态 。
  4. 客户端在收到服务器发出的响应后,需要给出确认连接 。确认连接中的 ACK 置为 1 ,序号为 seq = x + 1,确认号为 ack = y + 1 。TCP 规定,这个报文段可以携带数据也可以不携带数据,如果不携带数据,那么下一个数据报文段的序号仍是 seq = x + 1 。这时,客户端进入 ESTABLISHED (已连接) 状态 。
  5. 服务器收到客户的确认后,也进入 ESTABLISHED 状态 。
而 UDP 是面向数据报的协议,所以 UDP 压根不会有连接的概念,也就不会有三次握手建立连接的过程 。
数据传输结束后,通信双方可以释放连接 。数据传输结束后的客户端主机和服务端主机都处于 ESTABLISHED 状态,然后进入释放连接的过程 。
(客户端主机主动关闭连接)
TCP和UDP的不同之处 tcp和udp概念和区别


TCP 断开连接需要历经的过程如下
  1. 客户端应用程序发出释放连接的报文段,并停止发送数据,主动关闭 TCP 连接 。客户端主机发送释放连接的报文段,报文段中首部 FIN 位置为 1 ,不包含数据,序列号位 seq = u,此时客户端主机进入 FIN-WAIT-1(终止等待 1) 阶段 。
  2. 服务器主机接受到客户端发出的报文段后,即发出确认应答报文,确认应答报文中 ACK = 1,生成自己的序号位 seq = v,ack = u + 1,然后服务器主机就进入 CLOSE-WAIT(关闭等待) 状态,这个时候客户端主机 -> 服务器主机这条方向的连接就释放了,客户端主机没有数据需要发送,此时服务器主机是一种半连接的状态,但是服务器主机仍然可以发送数据 。

    推荐阅读