tcp 是一种面向连接的, 可靠的, 基于字节流的传输层通信协议. 是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的, 面向字节流.
udp(用户数据报协议)是 iso 参考模型中一种无连接的传输层协议, 提供面向操作的简单不可靠的非连接传输层服务, 面向报文.
它们之间的区别:
1,tcp 是基于连接的, 可靠性高; udp 是基于无连接的, 可靠性较低;
2, 由于 tcp 是连接的通信, 需要有三次握手, 重新确认等连接过程, 会有延时, 实时性差; 由于协议所致, 安全性较高; 而 udp 无连接, 无建立连接的过程, 因而实时性较强, 安全略差;
3, 在传输相同大小的数据时, tcp 首部开销 20 字节; udp 首部开销只有 8 个字节, tcp 报头比 udp 复杂, 故实际包含的用户数据较少. tcp 无丢包, 而 udp 有丢包, 故 tcp 开销大, udp 开销较小;
4, 每条 tcp 连接只能是点到点的; udp 支持一对一, 一对多, 多对一, 多对多的交互通信.
所以对于应用这方面:
如果对实时性要求高和高速传输的场合下需要使用 udp; 如果需要传输大量数据且对可靠性要求高的情况下应该使用 tcp; 在可靠性要求较低, 追求效率的情况下应该使用 udp.
对于 tcp 来说, 既然需要面向连接, 就会涉及到三个阶段: 连接建立, 数据传送, 连接释放三个过程; 而 "三次握手" 就发生在连接建立这个阶段, 下面对三次握手和四次挥手解释一下:
三次握手:
第一次握手: 客户端发送一个 tcp 的 syn 标志位置为 1 的包(连接请求), 指明客户打算连接服务器的端口;
第二次握手: 当服务器收到连接请求之后, 返回确认包 (ack) 应答, 即将 syn 和 ack 标志位同时致为 1(授予连接), 并为这次连接分配资源;
第三次握手: 客户端收到服务器的授予连接请求之后, 再次发送确认包(ack)(syn 标志位为 0,ack 标志位为 1), 并分配资源, 这样 tcp 就建立连接了.
四次挥手:
中断连接端可以是客户端也可以是服务端
假设是客户端发起的中断连接请求, 则客户端发送 fin 报文, 服务端接收到客户端发送的 fin 报文后, 意思是说:"客户端已经没有数据要发送给你了", 但是这时候如果服务端有数据没有发送完成, 则不必着急关闭 socket, 可以继续发送数据, 所以服务端先发送 ack, 告诉客户端, 收到了客户端刚才的关闭连接请求, 但是服务端还没有准备好, 还有数据没有发送完, 所以请客户端继续等我的消息, 这个时候客户端就进入了 fin_wait 状态, 继续等待服务端的 fin 报文; 当服务端确定已经发送完数据后, 则想客户端发送 fin 报文, 告诉客户端已经发送完数据, 可以关闭连接了; 当客户端接收到服务端的 fin 报文后, 就知道可以关闭连接了, 但是还是不相信网络, 怕服务端不知道要关闭, 所以客户端发送 ack 给服务端后进入了 time_wait 状态, 如果服务端没有收到 ack 则可以重传; 服务端收到 ack 后, 就知道可以关闭连接了; 当服务端等待了 2msl 后依然没有收到回复, 则证明服务端已经正常关闭了, 那客户端也会关闭连接了, 就这样, tcp 连接就完成了关闭.
来源: http://www.bubuko.com/infodetail-2484687.html