目录
TCP
- 传输控制协议
TCP
是面向连接、可靠的传输层协议(传输数据前,必须建立连接);- 每一条
TCP
连接只能有两个端点(服务器、客户端),所以每一条TCP
连接只能是点对点的(一对一,一个发一个收);TCP
面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的报文段);
TCP
具备“可靠性传输”、“流量控制”、“拥塞控制”等功能;
TCP的首部格式
序号 | 数据流中每个字节都有自己的序号,序号字段代表每次数据的发送位置 | |
确认号 | 主要出现于接收方的报文中,如果没有收到,确认号=序号(停留在上一次) | |
数据偏移 | 数据部分距离报文首部的偏移量 |
|
保留 | 为今后使用,现设置为0 | |
控制位 | 紧急URG | =1时优先传输 |
确认ACK | 对已接收数据的确认,=1时确认号才有效 | |
同步SYN | 建立连接时:SYN=1,ACK=0请求连接;SYN=1,ACK=1同意连接(响应) | |
推送PSH | =1,尽快交付进程,不等缓存填满 | |
复位RST | =1,连接出错,要释放连接,重新建立连接 | |
终止FIN | 用于释放连接,=1表示发送完毕。并要求释放 | |
窗口 | 用于滑动窗口技术,实现流量控制 | |
校验和 | 检验范围:首部+数据,计算校验和要在TCP报文前+12字节的伪首部 | |
紧急指针 | 配合PSH使用,指出紧急数据有多少,紧急数据放在报文数据的最前面 | |
选项 | 配合快速重传的SACK方法使用,指明选择性重传的数据 |
TCP的三次握手与四次挥手
三次握手
第一次握手
根据TCP首部内容,表示这是一个请求建立连接的数据包,其中seq=x为所传送数据的第一个字节的序号。
第二次握手
- 确认ACK=1,代表服务器同意连接
- 序号seq=y 的值由服务器指定,表示服务器发送数据时的第一个数据字节的序号
- 确认号ack=x+1,表示已经收到客户端发送的x个字节数据,并告诉客户端下次应从数据的第 x+1个字节开始发送
第三次握手
- 确认ACK=1,表示收到服务器的确认数据包
- 序号seq=x+1,表示发出的数据包就是数据的第x+1个字节
- 确认号ack=y+1,表示收到服务器发送y字节数据,并告诉服务器下次应从数据的第y+1个字节开始发送
四次挥手
第一次挥手
- 首先客户端向服务器发送连接释放的请求报文(数据包),并停止发送数据
- 在连接释放报文(数据包)的TCP首部中:终止FIN=1,确认ACK = 0
- 终止FIN=1,意味着客户端要主动释放客户端—>服务器的TCP连接;序号位seq为u,u值由客户端指定,随后等待B的确认。
第二次挥手
- 服务器收到连接释放的报文之后,给客户端发送确认报文。从客户端到服务器这个方向上的连接就释放了,TCP连接处于半关闭状态。此时客户端无法发送数据给服务器,但是服务器还可以发送数据给客户端,客户端仍可以接收
- 在服务器发送给客户端确认报文的TCP首部中:终止FIN=0,确认ACK=1,序号位seq=v,确认号ack=u+1
- 确认ACK=1表示收到了客户端发送的数据包,同意客户端释放连接
第三次挥手
- 若服务器已经没有向客户端发送的数据了,其应用进程就通知TCP释放连接,并向客户端发送确认报文
- 在确认报文的TCP首部中:确认ACK=1,终止FIN=1
- 确认ACK=1,表示服务器已经把需要发给客户端的数据发完了;终止FIN=1,表示服务器要释放服务器—>客户端的TCP连接
- 此后服务器不再向客户端发送数据,但能接收数据
第四次挥手
- 客户端收到服务器的连接释放报文段后,向服务器发出确认报文
- 在确认报文的TCP首部中:确认ACK=1,终止FIN = 0
- 确认ACK=1,表示收到服务器的确认报文,并同意服务器释放连接
UDP
一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。当
运输层使用UDP协议时,向其上层提供的也是无连接不可靠的传输服务。发送方给接收方发送
UDP用户数据报,若传输过程中用户数据报受到干扰而产生误码,接收方UDP可以通过该数据报
首部中的校验和字段的值检查出产生物码的情况,但仅仅丢弃该数据报其他什么也不做。发送方给
接收方发送UDP用户数据报,如果该数据报被英特网中的某个路由器丢弃了,发送方UDP不做任
何处理,因为UDP向上层提供的是无连接不可靠的传输服务。
UDP的首部格式
- 16位源端口号:表示数据从哪里来。
- 16位目的端口号:表示数据要到哪里去。
- 16位UDP长度:表示整个数据报(UDP首部+UDP数据)的长度。
- 16位UDP检验和:如果UDP报文的检验和出错,就会直接将报文丢弃。
总结
类型 | 特点 | 性能 | 应用层场景 | 首部 | ||
是否面向连接 | 传输可靠性 | 传输效率 | 所需资源 | |||
TCP | 面向连接 | 可靠 | 慢 | 多 | 要求通信数据可靠 | 20-60字节 |
UDP | 无连接 | 不可靠 | 快 | 少 | 要求通信速度快 | 8字节 |
- TCP 是面向连接的,UDP 是面向无连接的
- UDP程序结构较简单
- TCP 是面向字节流的,UDP 是基于数据报的
- TCP 保证数据正确性,UDP 可能丢包
- TCP 保证数据顺序,UDP 不保证