接着上一篇。
三次握手
tcp固定的头部结构中,含有6位标志:
其中我们主要介绍一下ACK,SYN,FIN三个标志。
ACK标志,表示确认号是否有用,我们称带有ACK标志的tcp报文为确认报文段;
SYN标志,表示请求建立连接,称带有SYN标志的tcp报文为同步报文段;
FIN标志,表示通知对方本端要关闭连接了,称为结束报文段。
connect()返回成功,三次握手完成
四次挥手
close()方法用来关闭 TCP 连接。此时,会进行四次挥手。
特殊情况下可能执行三次挥手,是第二次和第三次挥手合为一次,即回应和数据包发出同时进行。
关于三次握手和四次挥手的观察,可以使用tcpdump查看TCP连接的建立与关闭
TCP协议特点
TCP转移状态
TCP连接的任意一端在任一时刻都处于某种状态,当前状态可以通过netstat命令查看,
我们先来看一张图:
在上图中,TIME_WAIT状态存在的原因有两点:
1)可靠地终止TCP连接
2)保证让迟来的TCP报文段有足够的时间被识别并丢弃
流式服务特点
基于流(stream)的数据没有长度的限制,可以进行无限制的存取
但这种方式就会带来一个问题——粘包
举个例子:当客户端连续快速发送了多个数据,recv(1),recv(abc),recv(23),这些数据都被存入缓冲区封包,而这时候客户端就不知道数据开头和结尾在哪儿。
解决粘包:1)设置标记作为分隔符;
2)避免连续发送,一发一收。
应答确认和超时重传
发送端发送数据给接收端,接收端收到数据后会给发送端一个确认消息表示已经收到了消息。在发送端未收到确认信息前,数据会一直被保留,直到确认后才丢弃。这也构成了TCP的可靠性。
滑动窗口
TCP协议是利用滑动窗口实现流量控制的。发送方的滑动窗口如下所示:
在 TCP 的报头中有一个字段叫做接收通告窗口,这个字段由接收端填充,是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。所以发送端就会有一个发送窗口,这个发送窗口的大小是由接收端填充的接收通告窗口的大小决定的,并且窗口的位置会随着发送端数据 的发送和接收到接收端对数据的确认而不断的向右滑动,将之称为滑动窗口。
拥塞控制
几种方法:
1)慢开始
2)拥塞避免
3)快速重传
4)快速恢复