T'CP协议----传输控制协议,面向链接的可靠传输协议
特点:
- 面向链接的虚传输层协议
- 每一条 tcp建立只能有两个端点,每一条 tcp只能是点对点
全双工通信---同一时间同时收发信息,通信双方设有缓存,用来存储数据
缓存:
发送方:将要发送的信息
已发送但未收到确认的信息
接收方:还未被处理的信息
无序信息
- 面向字节流:整个tcp协议中都是对字节的处理,协议中对所有数据都当做是一系列字节来处理
tcp报文
源端口 目标端口
序列号
确认序列号
头部长度 服务质量 urg紧急位 psh推送位 syn链接请求 fin断开请求 ret复位 窗口大小
tcp校验 指针
选项
数据
urg:置为1,表示该字节需要紧急发送,将不在等待率先发送
psh:置为1,若发送端收到的tcp报文包含psh,立即将缓冲区内所有数据推送给应用进程
rst:置为1,表明tcp链接出现严重错误,立即将链接断开
校验和:检验首部和数据两部分
指针:urg置为1时才有意义
可靠性(四种机制):
- 流控:滑动窗口,缓冲区内有空余时,剩余数据依次填充,类似于一个窗口向后滑动
窗口值大小:在tcp建立时双方设置一个缓冲区,窗口值大小等于缓冲区,之后在每次确认报文内告知对方缓冲区剩余大小
- 排序:根据序号排序
- 确认:累积确认,发送方通过发送一段报文,接收方一次性确认
- 重传:在累积确认中,某个数据接收失败,发送发会重传所有未被确认的数据。为提高通信效率,会修改确认机制---选择确认,接收方在回复确认报文时会在选项字段添加未收到的数据,发送方根据确认报文选择发送
- 重传超时:当时间超过RTO未收到确认报文时,发送端会重新发送,当发送完第二个报文后在归定RTO时间还未收到确认报文,相应的RTO时间会加倍
RTT:往返时间,发送方将数据发送后到接收确认报文所用时间
RTO:超时重传时间,略大于 RTT,动态变化过程,会进行超时间隔加倍
- 快速重传:某段时间因网络拥堵导致RTT,RTO过大,之后网络恢复,实际RTO小于之前RTO,但依据RTO时间未到,发送方不会发送数据。因此接收方会主动请求数据,当发送方收到3个ack报文(冗余ack),会立即发送数据
面向连接:
连接建立:
- 套接字--------源ip,源mac/目标ip,目标mac
- 参数协商-----mss,窗口大小,确认机制。。。。。
- 资源分配
- 三次握手:
- 最初两设备处于closed状态,A先向B发送链接请求,因此A主动打开链接,B为被动打开链接
- B首先创建TCB传输控制块,并处于listen(收听状态)
- A创建TCB传输控制块,并向B发送链接请求报文,SYN置为1,选则一个初始序列号x,A进入SYN-SENT(同步已发送)状态。当SYN为1时,该报文不能携带数据,但要消耗一个序列号
- B收到SYN报文后,如果同意建立链接,则回复确认。回复报文中SYN和ACK都置为1,并随机选择一个序列号y,ack为x+1,同样不携带数据,B进入SYN-RECVD(同步已接收)状态
- A收到确认后还要向B发送确认,ACK=1,ack=y+1,seq=x+1,可以携带数据。如果不携带数据,则不消耗序列号,那么下一个数据段报文序号仍是x+1,链接建立,A进入ESTABLISHED(链接已建立)状态
- B收到A的确认后,进入ESTABLISHED(链接已建立)状态
TCB:存储tcp链接表,指向收发双方缓存指针,指向重传队列的指针,接受和发送序号。。。
最后A为什么还要向B确认:
如果因网络堵塞导致A发送的SYN报文段滞留,在连接释放后才到达B,B则会认为A又再一次想要建立连接,B会一直等待A发送的数据,但A并不会理睬B,导致资源浪费。在三次握手中,B未收到A的确认,所以连接不会建立
- 四次断开:
- A首先向tcp发送tcp释放连接,FIN=1,seq=u(前面已传送的数据的最后一个字节加1),可以携带数据,即使不携带数据,此报文也消耗一个序列号。A进入FIN-WAIT-1(终止等待1)状态
- B收到A的报文后,向A发送确认,seq=v(B之前传送的最后一个数据加1)ack=u+1,B进入CLOSE-WAIT(关闭等待)状态。此时整个tcp进程中,A对B的连接以关闭,但B对A仍有数据需要传送,整个tcp处于half-close(半关闭)状态
- A收到B的确认报文后,进入TIME-WAIT-2(终止等待2)状态,等待B向A发送的断开请求
- B向A,发送断开请求,FIN=1,ACK=1,seq=w(可能有数据传送),ack=u+1,B进入LAST-ACK(最后确认)状态。
- A向B发送最后确认,ACK=1,ack=w+1,aeq=u+1。此时tcp连接还未释放,必须经过时间等待计时器(TINE-WAIT timer)设置的2MSL后,A进入closed状态
- 当A撤销相应的TCB后,tcp连接断开
MSL最长报文段寿命,MSL=2min
- 保活计时器:接收方每收到发送方发送的数据,就会启动一次保活计时器,每75s发送一次报文,确认发送方是否存在问题,用来选择还需不需要维持链接,如果连续发送10次都未得到应答,则接收方会认为发送方出现异常,终止连接。