TCP与UDP
区别
- TCP面向连接, UDP无连接.
- TCP提供可靠服务, 通过TCP连接传输的数据, 无差错, 不丢失, 不重复, 按序到达. UDP尽自己最大努力交付, 不保证可靠交付.
- TCP面向字节流, UDP面向报文.
- UDP没有拥塞控制.
- TCP连接只能是点到点. UDP支持一对一, 一对多, 多对多的交互通信.
- TCP首部20字节, UDP首部8字节.
- TCP逻辑通信信道是全双工的可靠信道, UDP则是不可靠信道.
应用场景
- TCP, 应用在对网络通讯质量有要求高的时候, 比如整个数据要准确无误的传给对方, 如HTTP, FTP, SMTP.
- UDP, 应用在对网络通讯质量要求不高的时候, 要求网络通讯速度尽可能的快, 如语音, 视频, TFTP.
伪首部
伪首部通常有TCP伪首部和UDP伪首部. 在伪首部中, 有4字节源IP地址, 4字节目的IP地址, 1字节填充0, 1字节协议, 2字节包长度. 通过伪首部的校验, 可以确定是否是发送给本机的, 通过首部协议字段, 可以确认有没有误传.
伪首部是一个长度为12字节的虚拟数据结构, 其中的信息是从数据报所在的IP分组头中提取, 既不向下传送也不向上提交, 仅仅是为了计算校验和, 用以保证传输到正确地址和数据的正确性.
UDP首部
首部字段只有8字节, 包括2字节源端口, 2字节目的端口, 2字节长度, 2字节检验和. 12字节的伪首部是为了计算检验和临时添加的.
TCP首部
首部字段有20字节固定长度, 2字节源端口, 2字节目的端口, 4字节序号, 4字节确认号, 还有数据偏移, 保留字段, 标志位, 窗口大小, 检验和和紧急指针.
其中有些字段需要单独说明:
- 序号: 用于对字节流进行编号, 表示当前包中的第一个字节的编号.
- 确认号: 期望收到的下一个报文段的编号.
- 数据偏移: 是指数据部分距离报文段起始处的偏移量, 实际上是指首部长度.
- 确认ACK: 当ACK=1时, 确认号字段有效, 否则无效. TCP规定在建立连接后所有传送的报文段都必须把ACK置1.
- 同步SYN: 在连接建立时用来同步序号. 当SYN = 1, ACK = 0表示这是一个请求连接报文段. 若对方同意建立连接, 则响应报文中SYN = 1, ACK = 1.
- 终止FIN: 用来释放一个连接, 当FIN = 1时, 表示这个报文段的发送方数据已经发送完毕, 并要求释放连接.
- 窗口: 窗口值作为接收方让发送方设置其发送窗口的依据. 之所以要有这个设置, 是因为接收方的数据缓存空间有限.