TCP介绍
TCP(Transmission Control Protocol)传输控制协议:属于传输层协议,是一种基于IP的协议,TCP提供一种面向连接的可靠的字节流服务;
TCP三次握手
- 第一次握手:客户(Client)主动(Active Open)去连接服务端(Server),发送SYN=1,序列号为X。服务端为被动打开(Passive Open);
- 第二次握手:服务端收到该SYN请求后,会发送一个SYN=1,序列号为Y,同时附上对客户的回应ACK,序列号为客户的SYN序列号+1;
- 第三次握手:客户收到服务端的SYN后,同样回应ACK,序列号为服务端SYN序列号+1;
- TCP连接建立成功,接下来转发数据(同时序列号采用同上一样的规律);
(第三次握手是为了保证双方都能确定对方做好了准备,可以传输数据。防止连接建立失败导致数据丢失)
TCP四次挥手
- 第一次挥手:客户端发出释放连接请求,之后进入Fin-Wait-1状态等待服务端回应;
- 第二次挥手:服务端回应客户端的释放请求,进入Close-Wait状态。客户端进入FIN-Wait-2状态;
- 数据传输:服务端继续将剩余的数据传输完成;
- 第三次挥手:服务端数据传输完毕后,向客户端再次发起释放请求,服务端进入Last-ACK状态;
- 第四次挥手:客户端回应服务端的释放请求,等待一段时间(2MSL)后释放连接,服务端收到回应后释放连接;
TCP数据包
TCP首部长度为:固定首部(20字节)+可选选项(0~40字节)
且长度固定为4的倍数
字段 | 说明 |
---|---|
序列号 | 当前数据包的第一个字节序号 |
确认号 | 希望接收的下一个数据包的第一个字节序号 |
偏移 | 数据包头的长度 |
U | URG,为1代表紧急指针有效,该数据包紧急优先,应尽快传送 |
A | ACK,为1代表确认号有效 |
P | PSH,为1代表接收方应直接将报文段应直接交给应用层,无需等待缓存区装满 |
R | RST,为1代表出现严重错误,需要重新建立TCP连接。或用来拒绝非法报文和连接 |
S | SYN,为1代表建立连接请求 |
F | FIN,为1代表释放连接请求 |
TCP常见端口号
TCP端口 | 协议 | 说明 |
---|---|---|
20 | FTP-Data | 文本传输协议-数据端口 |
21 | FTP-Control | 文件传输协议-控制端口 |
22 | SSH | 安全壳协议 |
23 | Telnet | 远程签入协议 |
25 | SMTP | 简单邮件传输协议 |
53 / UDP-53 | DNS | 域名解析协议 |
80 | HTTP | 超文本传输协议 |
443 | HTTPS | 超文本传输安全协议 |
TCP流量控制
一、作用
双方的传输速率不一定一致,可能导致接受方处理不及时,便会将数据放在缓冲区中,此时若缓冲区已满,便会造成数据包的丢失,所以采用流量控制来控制发送方的发送速率,可通过滑动窗口来实现,主要由接收方反馈缓存情况来维护;
二、过程
- 窗口大小(receiver window 即 rwnd):在建立连接即TCP三次握手过程中,接收方便告诉了发送方自己的rwnd,之后发送方的数据大小不能超过该字段规定的大小;
- 举例:
说明:
- 接收端不一定给发送方的每条数据都发送ACK,可能累积好几个后用一个ACK同时确认;
- 接收方的窗口大小根据应用层接收、链路状态而定;
- 只有最开始的序号数据包(按序)成功被应用层接收即收到ACK后,窗口才会右移即按顺序滑动;
- 发送方只有确认前面的数据已经被接收(ACK),才会右移发送窗口(发送窗口内的数据会进行重传);
- 如果前面的数据包没有收到ACK,那么后面的数据包如果不按序接收,可能会导致其它的片段重传(包括已接收的但乱序的片段);
- 发送方收到接收方rwnd为0的ACK后,会停止发送数据,直到收到接收方新的rwnd不为0的ACK;
TCP拥塞控制
一、概念说明
拥塞:网络提供的资源不能够满足用户的需求(或者说用户对网络中某一资源的需求超过了所能提供的大小);
二、拥塞控制四种算法
- 慢启动(Slow Start):在建立新的TCP连接后,拥塞窗口(cwnd)初始化为一个数据包(MSS)大小,源端每收到一次ACK,cwnd的大小就翻倍,一直到16个数据包大小达到阀值(缺省16,必须是MSS的整数倍);
- 拥塞避免(Congestion voidance):当cwnd大小到达慢启动的设置阀值(SSH)后,采用拥塞避免,以线性(每次+1)的规律增长。当出现网络拥塞时,则将阀值降低为当前窗口大小的一半,并且窗口大小置1,继续慢启动算法;
cwnd < ssthresh: 慢启动
cwnd = ssthresh: 慢启动或拥塞避免
cwnd > ssthresh: 拥塞避免
网络拥塞: ssthresh = MAX( cwnd / 2, 2MSS), cwnd = 1
- 快重传(Fast Retransmit):当发送方连续收到3个相同ACK后,立即重传指定数据包,无需等待RTO时间后重传;
- 快恢复(Fast Recovery):当发送方收到超过3个以上的相同ACK后,执行快恢复算法;
连续3个相同ACK: ssthresh = MAX( cwnd / 2, 2MSS)
超过3个相同ACK后每收到一个重复ACK: cwnd = cwnd + ssthresh
收到3个或以上相同ACK后收到新的ACK: cwnd = ssthresh + MSS