目录
1. TCP三次握手和四次挥手
1.1 TCP与UDP的基本知识
-
运输层端口号,复用和分用的概念
1)运行在计算机上的进程使用进程标志符PID来标志。
2)但是在网络中,不同系统的进程标志符不一样,进行网络通信需要使用新的统一方法,对TCP/IP的应用进程进行标识
3)TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程。 -
UDP和TCP的区别:
1)概念:UDP:用户数据报协议 ; TCP:传输控制协议
2)连接方式: 无连接 ; 面向连接
3)交互通信:支持一对一,一对多,多对一; 仅支持一对一
4)数据处理方法:对应用层交付的报文直接打包,会丢失和乱序 ;面向字节流,没有边界,保证顺序和可靠。
5)传输方式:尽最大努力交付,也就是不可靠,不使用流量控制和拥塞控制;可靠传输,使用流量控制和拥塞控制。
6)首部对比:首部开销小,仅使用8字节; 首部最小20字节,最大60字节。
7)应用场景:UDP,包总量较少的通信,DNS和SNMP; TCP:FTP,HTTP和HTTPS -
TCP头格式
1)序列号:本TCP报文段数据载荷的第一个字节序号–解决网络包乱序
2)确认应答号:下一次期望收到的数据的序列号
3)控制位:
(1):ACK: 为1时确认应答字段有效。TCP建立连接之后,必须置为1
(2):RST: 为1时,TCP出现异常必须强制断开连接
(3):SYN:表示希望建立连接,(建立连接请求和建立连接请求的确定)
(4):FIN: 希望断开连接,不再有数据发送 -
为什么需要TCP协议,TCP工作在那一层?
1)IP层是不可靠的,不保证网络包的交付,按序交付和数据完整性。
2)TCP在传输层,进行可靠数据传输的服务,确保接收到收到的数据包是无损坏,无间隔,非冗余和按序的。 -
什么是TCP?
1)TCP是面向连接,可靠的,基于字节流的传输层控制协议
2)面向连接(一对一进行传输),可靠的(保证报文一定能够达到接收端),字节流(消息是有序的,前面没有传完,后面不会接受)。 -
什么是TCP连接?
客户端和服务端在三点信息上需要达成一致意见:
1)Socket: IP地址(确定主机)和端口号(确定应用进程)
2)序列号:解决乱序问题,需要同步
3)窗口大小:用来做流量控制 -
如何唯一确定TCP是一对一连接?
1)原地址,源端口,目标地址和目标端口 -
为什么UDP头部没有首部长度字段,而TCP头部有首部长度?
1)因为TCP可变长的选项字段,UDP是固定八个字节头部,不需要特别记录。 -
为什么UDP有包长度字段,而TCP头部没有包长度字段?
1)TCP数据长度=IP总长度-IP首部长度 -TCP首部长度,前面两个在IP首部格式已知,后者在TCP首部格式已知。
2)UDP是为了确保首部长度是4字节的整数倍。
1.2 TCP连接建立
TCP三次握手过程和状态的变迁(seq:序列号,ack:确认序列号)
-
三次握手过程
1)客户端随机初始化序号x,客户端发送TCP连接请求: SYN=1;seq=x; (不可携带数据)
2)服务端也随机初始化序号y,服务端发送TCP连接请求的确定:SYN=1;ACK=1;seq=y;ack=x+1; (不可携带数据)
3)客户端发送TCP连接请求确定的确定:ACK=1;seq=x+1;ack=y+1 (可携带数据) -
三次握手状态变化
1)发送前:两者都处于关闭状态closed
2)要发送了,服务器端处于主动监听listen状态
3)第一次握手:客户端发送连接报文后,处于syn_sent状态,表示已发送连接请求
4)第二次握手:服务端收到消息之后,发送报文,处于syn_rcvd状态,表示已发送请求的确定
5)第三次握手:客户端发送普通报文消息后处于established状态,服务端接收到消息后,也处于established状态。
-
为什么是三次握手,而不是两次和四次?
1)三次握手才能保证双方具有接受法发送的能力
2)通过三次握手,能够防止历史连接的建立(如果是历史连接,那么客户端会返回RST报文,而不是ACK,进行连接终止),较少双方不必要的资源开销(历史连接的建立),帮助双方同步初始化序列号
3)两次为什么不行:无法防止历史连接的建立,会噪声双方资源的浪费,无法可靠同步双方序列号。
4)为什么四次不行:三次握手就够了,四次就冗余了。
注意点:
1)在三次握手的时候,前两次报文中是不能携带数据的,最后一次可以。
2)如何在Linux系统中查看TCP连接状况:nestat -napt.
3)如果第三次握手,信息发送失败怎么办:服务端没有收到消息,就会重新发起第二次握手,重发之前的SYN+ACK(默认重发五次,之后自动关闭连接);客户端接受到消息后,再次进行第三次握手,如果第三次报文中有数据,则服务端会返回RST包响应。
4)如果连接已经建立,但是客户端出现问题怎么办:服务端每次和客户端进行连接会复位一个计时器,如果两个消息内,没收到服务端任何消息,则会发送探测报文段(75秒一次,发送10次),还是没有反应,则关闭连接。
-
为什么客户端和服务端的初始序列号ISN是不相同的?
1)如果序列号相同,无法区分是现在报文还是历史报文,容易造成数据的混乱,第二点也为了防止黑客伪造相同序列号的TCP报文。 -
既然IP层会分片,为什么TCP还需要MSS:
1)MTU:一个网络包的最大长度:IP头部,TCP头部和数据
2)MSS:数据部分: MTU-IP头部-TCP头部
3)当IP层有一个超过MTU大小报报文数据要发送,需要进行分片,但是IP层没有超时重传机制,报文丢失需要重新整个发送。
4)TCP进行分片,约定之为MSS,故不需要IP进行分片。有超时重传机制,会针对丢失部分进行重传。,增加效率。 -
什么是SYN攻击,如何进行避免?
1)SYN攻击:黑客伪造多个IP地址和SYN报文进行发送,服务端收到返回SYN报文,但是一直无法匹配连接在,占满服务器SYN接受队列, 使得服务器瘫痪。
1)解决办法:
(1):通过修改Linux内核参数,控制队列的大小和连接的最大数 / 当队列满时直接返回RST,丢弃连接。
1.3 TCP连接断开
TCP四次挥手过程和状态的变迁
-
四次挥手过程
1)TCP客户端发送连接释放:FIN=1;ACK=1;seq=u,ack=v; (占一个内存)
2)TCP服务端发送普通确定:ACK=1;seq=v,ack=u+1;
3)前两步把客户端到服务端的连接断开了,但是服务端还是可以向客户端法消息。
4)TCP服务端发送连接释放:FIN=1;ACK=1;seq=w;ack=u+1;
5)TCP客户端发送普通确认:ACK=1;seq=u+1;ack=w+1;
6)此时:TCP服务端关闭,客户端经过2MSL才会进入关闭状态。(MSL:最长报文段寿命) -
为什么需要四次挥手
1)前两次挥手,进行单方面的断开。客户端不再发
2)后两次挥手:服务端不再发送,关闭连接
3)2MSL之后,旧连接发送数据全部发送完,客户端关闭。 -
为什么需要TIME_WAIT状态
1)防止旧连接的数据包
2)保证连接正常关闭 -
TIME_WAIT过长的危害
1)内存资源占用
2)端口资源占用
1.4 Socket编程
2. TCP重传,滑动窗口,流量控制和拥塞控制
2.1 TCP重传机制
在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示收到消息。
**重传机制有:**超时重传,快重传,SACK和D-SACK。
-
超时重传:发送数据时,设定一个计时器,当超过指定时间,没有收到对方的ACK确认应答抱回,会重新发送数据。
1)发生时刻:数据包丢失和确认应答丢失
2)超时重传时间选择:超时重传时间为RTO,数据从网络一端传到另一端时间为RTT,RTO应该需要略大于RTT。 -
快重传:当收到三个相同的ack=x报文之后,会在定时器过期之前,重传丢失的seq=x包;
1)存在问题:不知道ack=x报文是谁传回来的,所以重传,是重传之前的一个,还是重传所有问题。 -
SACK重传:可以将缓存的地图发送给发送方,这样就知道哪些数据收到了,哪些数据没收到,只重传丢失的数据。
-
Duplicate SACK重传 :在SACK基础上携带额外信息,告知发送方有哪些数据包自己重复接收了。
2.2 TCP滑动窗口
解决发送方发出一个数据,在收到接收方收到确定信息才能发送下一个信息的问题。
1)引入窗口概念:及时数据往返时间较长,它也不会降低网络通信的效率。
2)窗口大小:无需等待确认应答,而可以继续发送数据的最大值。
3)匹配:发送端的滑动窗口和接收端的滑动窗口需要匹配。
2.3 流量控制
流量控制:让发送方的发送速率不要太快,要让接收方来得及接收。
-
怎样进行流量控制
1)利用滑动窗口可以有效对发送方进行流量控制。滑动窗口的值与接收方内存大小相关。
2)TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小
3)TCP发送方收到接收方的零窗口通知后,应启动持续计时器,计时器超时,向接收方发送零窗口探测报文。 -
存在问题:如果发送方一直在等待接收方的非零窗口通知,接收方的非零窗口通知一直发不出去,会导致死锁,怎么解决
1)存在一个持续计时器,如果一直没有收到接收方的非零窗口通知,会发送一个零窗口探测报文,进行探测,打破死锁局面。
2.4 拥塞控制
- 拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就会变。
- 危害:网络拥塞不进行控制,网络吞吐量将会随着输入负荷增大而降低
- 出现网络拥塞依据:没有按时收到应当到达的确认报文,即发生超时重传。
- 拥塞控制的四种方法:
(拥塞窗口cwnd作为发送窗口,慢开始门限ssthresh)
1)慢开始算法:当cwnd<=ssthresh,使用慢开始策略,每一次cwnd扩大到原来的两倍。
2)拥塞避免算法:当cwnd>=ssthresh时,使用拥塞避免算法,cwnd每一次加一;当出现拥塞的时候,慢开始门限ssthresh更新为此时拥塞窗口大小的一半,且拥塞窗口置为1,启动慢开始方法。
3)快重传算法
问题:发生超时重传,不一定是发生了拥塞,也可能是传递出错了。
解决办法:快重传,当出现三次连续的重复确认,就不等超时重传计时器超时,即刻进行数据重传。
4)快恢复算法:发送方将ssthresh和cwnd都调整为当前窗口一半,执行拥塞避免算法。
2.5 TCP如何保证数据的可靠传输
- 数据进行分割为数据块,打包发送
-
校验和:检验数据是否传输错误
- 流量控制
- 拥塞控制:慢开始算法,拥塞避免算法,快重传和快恢复算法。
- 超时重传,快重传
参考内容:小林图解计算机网络