TCP与UDP协议

UDP协议

特点
面向无连接,不可靠的数据报协议
不保证安全,性能比较好

  • 无连接 知道接收端的IP和端口号就直接进行传输,不需要建立连接
  • 不可靠:没有确认机制、重传机制;如果因为网络故障无法发给对方,UDP协议也不会给应用层返回任何错误信息
  • 面向数据报:能传输的数据最大长度为64K,不能灵活地控制读写数据的次数和数量
    - 应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。
  • 有接受缓冲区,没有发送缓冲区。
  • UDP的Socket既能读,也能写(全双工)

TCP协议

特点
面向连接,可靠的流协议

  • 有连接
  • 可靠的
  • 面向字节流
  • 具有接受和发送缓冲区

实现原理

确认应答(ACK)机制

在TCP中,当发送端的数据到达接受主机时,接受端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)
TCP与UDP协议

  • TCP通过肯定的**确认应答(ACK)**实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答。
  • 如果有确认应答,说明数据已经成功到达对端。
  • 反之,在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。
  • 如果接收端是收到发送端发送的数据了,但返回的确认应答在途中丢失,这种情况下,发送端也会进行重新发送。但对于接收端来说,他会反复收到相同的数据。而为了对上层应用提供可靠的传输,必须得放弃重复的数据包。

如何识别重复接受的数据包

  • 这时要引入***。***是按照顺序给发送数据的每一个字节都标上编号。接收端通过查询接收数据TCP首部中的***和数据的长度,将自己下一步应该接受的序号作为确认应答返送回去。
    通过***和确认应答号,TCP实现可靠传输。

超时重传机制

超时重发指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。

如何确定这个超时重发的具体时间长度?

  • TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间。
  • TCP协议在每次发包时,都会计算往返时间及其偏差。将这个往返时间和偏差相加超时重发的时间就比这个总和稍大一点。
  • 数据被重发之后若还是收不到确认应答,则进行再次发送。之后等待应答的时间将会以2倍、4倍的指数函数延长。
  • 数据不会被无限次的重发,达到一定重发次数后,若果还没收到确认应答返回,就会判断网络或接受端主机发生异常,强制关闭连接,并且通知应用通信异常强行终止。

总结
系统基于TCP协议实现,动态计算报文的最大生存时间(MSL),超时时间设为2MSL,超过超时时间,表示丢包(发送数据包丢失或确认应答数据包丢失),需要重新发送数据包(系统缓冲区保存有数据,可以重发)

连接管理机制

正常情况下,TCP通过3次握手建立连接,4次挥手断开连接

建立连接过程

使用TCP协议在数据通信之前,要通过TCP首部发送一个SYN包作为建立连接的请求确认应答,若接受方发来确认应答,则认为连接建立(单方向)。
若主机A要和主机B通信,主机A向B发送SYN请求,主机B 会发送回确认应答,这时还会捎带发送B对A的SYN请求(或者单独的发送一次SYN请求),主机A收到B发送的ACK应答和SYN请求,又返回ACK请求给B,这时AB之间才是建立连接。

TCP与UDP协议

断开连接过程

TCP与UDP协议

滑动窗口机制
窗口大小是指无需等待确认应答就可以继续发送数据的最大值
窗口大小设置依赖ACK响应报文中的窗口大小字段和拥塞控制

TCP与UDP协议

  • 发送前四个段的时候, 不需要等待任何ACK, 直接发送;
  • 收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
  • 操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;
  • 窗口越大, 则网络的吞吐率就越高;

流量控制机制
拥塞控制机制
延迟应答机制
粘包问题
心跳检测

两个问题

  1. 一个进程是否可以bind多个端口号?能

  2. 一个端口号是否可以被多个进程bind?不能
    结合实例:一个人可以有几个不同的手机号,但是一个手机号只能被一个人拥有。

参考资料:图解TCP_IP_第5版