区别

TCP 中连接是谁发起的,在 UDP 中报文是谁发送的。


TCP 在 IP 报文的基础上,增加了诸如重传、确认、有序传输、拥塞控制等能力,通信的双方是在一个确定的上下文中工作的。

UDP 它是一个不可靠的通信协议,没有重传和确认,没有有序控制,也没有拥塞控制,不保证有效传递以及报文有序


TCP 的发送和接收每次都是在同一个确定的上下文

UDP 的每次接收或发送都是一个独立的上下文


套接字(​ ​socket)

通信时,各自通信连接中的端点


定义与优势:

TCP(字节流套接字:面向连接的“数据流”协议 ):是可靠的,双向连接的通讯串流

UDP(数据报套接字:无连接的“数据报”协议):快速



服务端接收连接

1、创建socket

2、bind 关联套接字地址和端口

3、listen 转换套接字为被动接收的(默认创建的套接字是 主动发起请求的)

4、accept  与客户端连接建立后,操作系统内核通知应用程序。


TCP

连接过程

1、服务端初始化

2、客户端初始化 socket,与服务端 TCP 三次握手

3、客户端和服务器端建立连接( 一旦连接建立,数据的传输就不再是单向的,而是双向的,这也是 TCP 的一个显著特性

4、客户端 close ,发送 FIN 包到服务端,服务端收到后 执行被动关闭,服务器端也会执行 close 函数,整个链路完全关闭


客户端发起连接过程

1、创建socket

2、connect 服务端 TCP需要建立连接


TCP三次握手过程

  1. 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当前发送序列号 j,客户端进入 SYNC_SENT 状态;
  2. 服务器端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 j+1,表示对 SYN 包 j 的确认,同时服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号为 k,服务器端进入 SYNC_RCVD 状态;
  3. 客户端协议栈收到 ACK 之后,使得应用程序从 connect 调用返回,表示客户端到服务器端的单向连接建立成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对服务器端的 SYN 包进行应答,应答数据为 k+1;
  4. 应答包到达服务器端后,服务器端协议栈使得 accept 阻塞调用返回,这个时候服务器端到客户端的单向连接也建立成功,服务器端也进入 ESTABLISHED 状态。


发送缓冲区

TCP 连接成功建立后,操作系统内核会为每一个连接创建发送缓冲区 调用 write 函数时,实际所做的事情是把数据从应用程序中拷贝到操作系统内核的发送缓冲区中,并不一定是把数据通过套接字写出去。


对于 send 来说,返回成功仅仅表示数据写到发送缓冲区成功,并不表示对端已经成功收到。


对于 read 来说,需要循环读取数据,并且需要考虑 EOF 等异常条件。

UDP

适用

对时延、丢包都不是特别敏感的场景