特点
UDP用户数据报协议
- 无连接
- 尽最大努力交付
- 面向报文
- 没有拥塞控制
TCP传输控制协议
- 面向连接
- 提供可靠交付
- 全双工通信
- 面向字节流
TCP报文段首部格式
TCP连接过程主要解决三个问题
- 使每一方能确知对方的存在
- 允许协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项等)
- 对运输实体资源(如缓存大小)进行分配
字段解释
- 源端口和目的端口 分别写入源端口号和目的端口号
- 序号 报文段序号 如一报文段序号字段值是301,携带数据共有100字节,即本报文段数据的第一个字节序号是301,最后一个字节序号是400,下一个报文段(如果还有)的数据序号从401开始
- 确认号 期望收到对方下一个报文段的第一个数据字节的序号 如服务器正确收到了客户端发送过来的一个报文段,其序号字段值是501,数据长度是200字节,这表明服务器正确收到了到序号700为止的数据,因此服务器期望收到下一个数据序号是701
- 数据偏移
- 保留
- 紧急URG URG=1时此报文段中有紧急数据应尽快送达
- 确认ACK ACK=1时确认号字段才有效
- 推送PSH PSH=1接收方尽快交付接收应用进程,不再等整个缓存填满后再向上交付
- 复位RST RST=1表明连接出现严重差错,必须释放再重新建立运输连接
- 同步SYN SYN=1 ACK=0表示连接请求报文,若对方同意连接则返回SYN=1 ACK=1
- 终止FIN FIN=1表明此报文段的发送方的数据已经发送完毕并要求释放连接
- 窗口 发送本报文段的一方的接收窗口
- 校验和 检验范围包括首部和数据这两部分
- 紧急指针 URG=1时指出本报文段中紧急数据的字节数
- 选项 长度可变
三次握手
- 服务器进程进入监听LISTEN
- 客户端向服务器发起连接请求,设置SYN=1 seq=x,进入SYN_SENT
- 服务器收到请求同意连接,返回SYN=1 ACK=x+1 seq=y,进入SYN-RCVD
- 客户端收到服务器确认,设置SYN=1 seq=x+1 ACK=y+1,进入ESTABLISHED
- 服务器收到客户端确认后进入ESTABLISHED
- 若最后服务器向客户端发送的报文拆成两部分ACK=1 ack=x+1 和 SYN=1 seq=y 就变成了四次握手
四次挥手
- 客户端设置FIN=1 seq=x+2,进入FIN_WAIT-1
- 服务器收到释放连接报文段后发出确认ACK=x+3,进入CLOSE-WAIT
- 客户端收到服务器确认后,进入FIN-WAIT-2,等待服务器发出释放报文段
- 服务器没有发送的数据,应用进程通知TCP释放连接,FIN=1 seq=y+1,服务器进入LAST-ACK
- 客户端收到服务器的释放报文段后,进入TIME_WAIT,完成后进入CLOSED
- 服务器收到了客户端的确认后进入CLOSED
窗口滑动机制
TCP滑动窗口是以字节为单位,一是提供TCP的可靠性,二是提供TCP的流控特性。同时滑动窗口机制还体现了TCP面向字节流的设计思路。
1 基本原理
对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类。
- 已经发送并得到对端ACK的
- 已经发送但还未收到对端ACK的
- 未发送但对端允许发送的
- 未发送且对端不允许发送
已经发送但还未收到对端ACK的
和未发送但对端允许发送的
这两部分数据称之为发送窗口。
2 实现面向流的可靠性
- 最基本的传输可靠性来源于
确认重传
机制。 - TCP的滑动窗口的可靠性也是建立在
确认重传
基础上的。 - 发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
- 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。