TCP---传输控制协议
是一种面向连接的可靠传输协议。可靠、有序、无丢弃和不重复。
特点:
-
TCP是面向连接(虚连接)的传输层协议
-
每一条TCP连接有且只能有两个端点。
-
可靠、有序、无丢弃和不重复。
-
TCP协议提供全双工通讯 。
- 发送缓存
- 存放发送方TCP准备发送的数据。
- TCP已发送但是没有收到确认的数据。
- 接收缓存
- 存放发送端发送来的不按照顺序到达的数据
- 按照顺序到达的数据,但并未被应用程序读取
- 发送缓存
-
TCP是面向字节流的。TCP将应用层数据仅看做是一串无结构的字节流。
TCP连接的四元组(源IP、源端口、目IP、目端口)--->唯一标识一条TCP连接。
套接字--->IP:port
确认序列号:接收方期望收到发送方发送的下一个字节的序号 。1.接收方希望接收到的报文序号;2.该序号之前的数据以全部接收。-----累积确认机制。
选项字段:长度可变。MSS数值、窗口扩大因子、时间戳、选择确认机制。
确认位ACK:当ACK=1时,确认号有意义。在连接建立以后,所有传输的报文段都必须将该标志位置为1.
同步位SYN:SYN=1时,代表该数据段是一个连接请求报文。
终止位FIN:当FIN=1时,表明此报文段发送方数据已发送完毕,要求释放连接。
复位RST:表明TCP连接出现严重错误,需要释放连接并重新建立连接。
紧急位URG:代表该报文中存在高优先级的数据,应尽快处理。需要配合紧急指针使用。
推送位PSH:接收方应尽快将接收到的数据交付给对应应用程序。
TCP的可靠性
确认、重传、排序、流控。
MTU:最大传输单元--->以太网环境下1500字节--->数据包大小。
MSS:最大数据段长度
RTT--->往返时间(指发出端将数据发送后,到本端接收到对端反馈的确认报文的时间总和)
RTO--->超时重传时间
RTO取值略大于RTT值。
快速重传机制--->根据接收方的反馈信息进行数据重传。客户端需要连续接收到三次确认序列号相同的ACK报文,则认为数据丢失,需要进行数据重传。
快速重传机制会导致部分数据重复传输,降低数据传输效率。
解决思路:使用选择确认机制。--->在TCP首部的选项字段中,添加上未接收到的数据信息。发送方接收到该确认报文后,会根据选项字段内容,重新传输缺少的数据部分。
选择确认机制是否可以执行是需要通讯双方进行协商的。--->在三次握手的前两次SYN报文中进行协商。
RTO数值是动态变化的数值。超时间隔加倍。
窗口:窗口的大小是可以指定的,窗口大小指的是无需等待确认报文,而可以直接发送的数据包的最大值。
rwnd(接收窗口)---最开始等于整个缓存区的大小,浮动变化。
TCP要求发送方依据rwnd发送数据量。发送方的发送窗口大小是依据接收方的反馈信息中的接收窗口大小而设定的。
TCP连接的建立
TCP连接连接需要解决的问题:
1、知晓对端的套接字信息
2、允许双方进行参数的协商(窗口值、选择确认机制、是否使用窗口扩大因子)
3、对设备进行资源分配
当TCP连接建立成功,但是客户端突发故障。
此时服务端会等到2小时时间,若2小时时间内没有收到任何客户端的数据,则服务端发送一个探测报文,以后每隔75秒发送一次。若一连发送10次仍没有回复,则服务器认为客户端出现故障,关闭连接。
三次握手
第一次握手:
起初两端都处于关闭状态。一开始,TCP服务端就进入监听状态,被动等待 TCP 客户端的连接请求。在打算建立 TCP 连接时,TCP客户端发送一个 TCP 连接请求报文段。随机产生一个序号字段 seq=x。然后将该数据包发送给服务端,客户进入 SYN-SENT (同步已发送)状态,等待服务端确认;
第二次握手:
服务端收到SYN = 1 数据包后得知客户端请求建立连接。服务端将同步位 SYN 和确认位 ACK 都置为 1,表明这是一个 TCP 连接请求确认报文。随机产生一个序号字段seq=y,ack=x+1,并将该数据包发送给客户端以确认连接请求,客户端进入 SYN-RCVD (同步已接收)状态;
第三次握手:
客户端收到确认报文后,检查ack是否为x+1,ACK是否为1,如果正确则还要向服务端发送一个TCP确认报文段,并进入连接已建立状态。该报文的ACK为1,表明这是一个TCP确认报文段,序号字段 seq 被设为x+1,确认号字段ack=y+1。服务端检查 ack 是否为y+1,ACK是否为1,如果正确则连接建立成功,服务端进入连接已建立状态。现在双方都进入连接已建立状态,完成三次握手。
四次挥手
第一次挥手:
客户端发送TCP连接释放报文段,并进入终止等待1状态。该报文段首部种的终止位 FIN 和确认位 ACK 都设置为 1 ,表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。序号seq=u,它等于之前 客户端已经传送过的数据的最后一个字节的序号加1 。确认号 ack 的值设置为v,它等于TCP 客户进程之前已收到的数据的最后一个字节的序号加1。
第二次挥手:
服务端收到连接释放报文段后,会发送一个普通的 TCP 确认报文段并进入关闭等待状态。该报文段首部中的确认位ACK被设置为1;seq 设置为 v ,它等于服务端之前已传送过的数据的最后一个字节的序号加 1 。确认号 ack 字段的值被设置为u+1,这是对连接释放报文的确认。
第三次挥手:
客户端收到确认报文段后就进入终止等待 2 状态,当服务器也没有了可以传的信息之后,给客户端发送TCP连接释放报文段并进入最后确认状态。该报文段首部中的终止位FIN和确认位ACK的值都设置为1,seq=w,ack=u+1 。
第四次挥手:
客户端收到连接释放报文段后,需要向服务端发送TCP确认报文段,并进入时间等待状态。首部中的确认位ACK=1,seq=u+1,ack=w+1,这是对 TCP 连接释放报文段的确认。收到该报文后就进入关闭状态。