本文引用了B站王道计算机考研---计算机网络中的讲解,以及TCP/IP详解---卷1:协议中的TCP的部分内容,链接就不放了,感兴趣的B站搜王道论坛,如有侵权,联系本人删除。
- 通信特点:TCP提供一种1.面向连接的(虚连接)、2.可靠的、3.面向字节流的、4.端到端、5.全双工的传输层的通信服务;
- 面向连接:是指TCP的两个应用程序必须在他们可交换数据前,通过相互联系建立一个TCP连接;
- 可靠:可靠有序,不丢不重,可以靠检验和字段验证数据在传输过程中是否存在差错,通过序列号和确认号机制保证数据的有序性和完整性,另外还有超时重传等机制保证数据的完整性;
- 面向字节流:TCP协议将程序传递下来的数据视为一连串的无结构的字节流;
- 端到端:端点是指计算机中的应用程序;
- 全双工:
- 发送缓存:1.准备发送的数据;2.已发送但尚未收到确认的数据。
- 接收缓存:1.按序到达但尚未被应用程序读取的数据;2.没有按序到达的数据。
- 报文格式
- 源端口号:0 ~ 65535;
- 目的端口:0 ~ 65535;
- 序列号:当前发送报文的第一个字节在字节流中的编号;
- 确认号:下次待接收的字节流编号即为本次接收最后一个字节编号+1;
- 头部长度:当前头部长度字段为4位,取值为0~15,8 bit = 1 Byte,4 Byte = 1字, 15 * 4 Byte = 60 Byte,算上可变选项可有60字节的TCP首部,其中固定长度20字节,选项为40字节;
- 保留字段;
- 8个控制位
- CWR:拥塞位;
- ECE:有知道的大佬看到留言补充下(多谢);
- URG:紧急位,报文段中存在紧急数据,应尽快传送,无需在缓存中排队,配合紧急指针使用;
- ACK:确认位,连接建立后,ACK = 1 ;
- PSH:推送位,发送端缓存为空,接收方应尽快向上提交当前报文段;
- RST:复位位,TCP连接出现重大差错,需重新建立连接时 RST = 1;
- SYN:同步位,连接请求&连接接受,SYN = 1;
- FIN:结束位,释放连接时,FIN = 1;
- 窗口大小:对应接收端窗口能够接收字节的量,详情参考流量控制;
- TCP校验和:使用16bit反码运算
- 填充伪首部字段;
- 全零填充检验和字段;
- 填充数据部分(没有16bit对齐);
- 反码(求和(伪首部+首部+数据));
- 填入检验和字段;
- 去掉伪首部后发送。
- 紧急指针:本报文段中紧急数据的字节数(从0~紧急指针的位置);
- 选项:最常见的选项字段为MSS(Maximum Segment Size)即“最大段大小”,MSS指定了该选项的发送者在相反方向上希望接收到的报文段的最大值;
- 伪首部:
注:伪首部只有在计算检验和时出现,不向下传送也不向上递交;
- 源IP地址:当前主机IP地址(选填);
- 目的IP地址:通信端主机地址;
- 第三个字段默认为全零字段;
- 协议号:为当前传输层指令的协议号,TCP指令的协议号为6;
- TCP长度:长度值 = 当前TCP首部长度(60 Byte) + 数据字段长度。
- 连接建立:也可以理解为是 三次握手 的过程,TCP的连接建立采用的是 客户---服务器 方式,主动建立连接的应用进程称为客户端,被动等待连接建立的应用进程叫服务器。
1.一个TCP连接的两端是由一个四元组构成的,分别是源IP地址,源端口号,目的IP地址,目的端口号,即一对端点(计算机中的应用程序)或者一对套接字(socket 插口)构成,其中通信的每一端都由一对套接字(IP, Port)所唯一标识。
2.SYN报文:一个在TCP头部SYN字段 置位的TCP/IP数据包;
3.SYN报文也能够承载应用数据,不过伯克利套接字(Socket)API不支持这种方式。
- 客户端即主动发起连接的应用程序首先发送一个同步(SYN)报文,并指明自己想要连接的端口号,提供初始序列号(Initial Sequence Number)由于该报文段为同步报文段,故 SYN = 1,Seq = ISN(c);
- 服务器收到来自客户端的连接请求后,也需要发送同步报文段作为回应,并提供服务器端的初始序列号,故 SYN = 1,ACK = 1,Seq = ISN(s),Ack = ISN(c) + 1;
- 客户端为了确认服务器的连接请求,需要对服务器的连接请求进行回复,ACK = 1,Seq = ISN(c) + 1, Ack = ISN(s) + 1;
- 连接释放:四次挥手
注:任何连接的一端都有可能发起连接释放。
- 连接的主动释放一端首先发送FIN报文,对上次接收的报文进行确认,并对上次报文进行回复,故 FIN = 1,ACK = 1,Seq = K,Ack = L;
- 连接被动等待的一方对释放请求报文段进行回复以表明收到释放连接的请求,故 ACK = 1,Seq = L,Ack = K + 1;
- 此时连接的被动等待一方的上层应用程序会被告知另一端已经提出释放请求,这将导致应用程序发起自己的释放连接操作,故 FIN = 1,ACK = 1,Seq = L,Ack = K + 1;
- 连接主动释放一端将Ack的值+1,作为对被动等待一端的释放请求的响应,故 ACK = 1,Seq = K,Ack = L + 1。
- 可靠传输:保证接收到的字节流数据与发出的字节流数据相同。
- 校验:TCP头部校验和,保证每个报文段的信息不会出错;
- 序号:报文段的序列号,发送端以报文段为单位给信息编号,在接收端检查报文段序号,保证接收端有序;
- 确认:接收方在接收到数据后会回复确认报文,确认报文中的确认号字段会指出下一个待接收的报文段序号,保证报文段不会丢失;
- 累计确认(TCP默认方式):接收方收到多个报文段后回复确认报文,确认号为当前最大连续的报文编号;
- 捎带确认:接收方需要发送数据给发送方,将确认号捎带返回。
- 重传:发送方在规定时间内没有收到确认报文,就需要重新发送已发送的报文段;
- 超时时间:采用自适应算法,动态重传时间RTTs(Round Trip Time smooth)---加权平均往返时间;
- 冗余确认:接收方接收到序号大的失序报文段时,会发送一个冗余ACK报文,指出期望接收到的下一个报文段序号;
- 快速重传:当发送方收到三个连续的冗余确认报文段时,会按照冗余确认报文段中的确认号重新发送报文段。
- 流量控制:发送方发送速率过快,接收方来不及接收,导致丢包率过高;
- 滑动窗口:接收方通过设置确认报文段中的窗口字段(rwnd)动态的调整发送端发送窗口的大小,滑动窗口的大小 = min(rwnd,cwnd);
- 探测报文:当接收方确认报文段的窗口字段设置为0时,即滑动窗口为0,停止接收数据,发送方进行等待,当接收方再次发送非0值的窗口字段报文丢失、或发送方等待超时时,发送方会发送探测报文,接收方会回复当前窗口值;
- 拥塞控制:当网络中 资源需求总和 > 可用资源 时(资源:带宽,缓冲区等),造成网络中资源供应不足,导致吞吐量随着输入的复合增大而下降(吞吐量:某一时刻,网络中设备中最大速率);
- 全局性:多台主机同时使用网络资源导致当前网络拥塞,如果只有一台主机直接使用流量控制就可以了;
- 拥塞控制&流量控制对比:
- 拥塞控制策略:
- 慢开始&拥塞避免:
注:当前策略三种机制:
1.慢开始(0~2,13~17);
2.拥塞避免(4~12,17~23):加法增大;
3.网络拥塞(阈值减半):乘法减小。
- 慢开始:TCP开始发送报文时将cwnd=1,即一个最大报文段长度MSS,每经过一个传输轮次(RTT),cwnd会加倍,即cwnd以指数大小增长,直到cwnd增长到阈值(ssthresh),然后改为拥塞避免;
- 拥塞避免:当cwnd超过ssthresh后,cwnd += 1,直到发送方判断出现网络拥塞(未按时收到确认);
- 当上述1、2步骤执行过程中出现拥塞情况后,立即将ssthresh /= 2,然后重复上述步骤;
- 快重传&快恢复:
注:上述两种策略往往都会在TCP通信中使用,慢开始&拥塞避免用于TCP连接及网络超时;快重传&快恢复用于收到冗余ACK确认。
- 快重传:参考本节5.4.3快速重传;
- 快恢复:当发生拥塞时(发送方收到三个连续冗余ACK报文),将阈值ssthresh设置为原来的1/2;
- 慢开始&拥塞避免:
- 应用:
- FTP:文件传输协议(File Transfer Protocol),用于文件传输,Port = 21;
- HTTP:超文本传输协议(Hyper Text Transfer Protocol),用于普通浏览,Port = 80;
- HTTPs:超文本传输安全协议(Hyper Text Transfer Protocol over SecureSocket Layer),在HTTP 的基础下加入SSL,Port = 443;
- TELNET:远程登陆协议,通过一个终端登陆到网络,Port = 23;
- SSH:安全外壳协议(Secure Shell),用于加密安全登陆,替代安全性差的Telent协议,Port = 22 ;
- POP3:邮局协议(Post Office Protocol - Version 3),收邮件使用,Port = 110;
- SMTP:简单邮件传输协议(Simple Mail Transfer Protocol),用来发送电子邮件,Port = 25。
- 待补充:发送窗口、发送缓存、接收窗口、接收缓存、停等协议、SR协议、GBN协议