计算机网络3--TCP篇

1. TCP三次握手和四次挥手

1.1 TCP与UDP的基本知识

  1. 运输层端口号,复用和分用的概念
    1)运行在计算机上的进程使用进程标志符PID来标志。
    2)但是在网络中,不同系统的进程标志符不一样,进行网络通信需要使用新的统一方法,对TCP/IP的应用进程进行标识
    3)TCP/IP体系的运输层使用端口号区分应用层的不同应用进程

  2. UDP和TCP的区别:
    1)概念:UDP:用户数据报协议 ; TCP:传输控制协议
    2)连接方式: 无连接 ; 面向连接
    3)交互通信:支持一对一,一对多,多对一; 仅支持一对一
    4)数据处理方法:对应用层交付的报文直接打包,会丢失和乱序 ;面向字节流,没有边界,保证顺序和可靠。
    5)传输方式:尽最大努力交付,也就是不可靠,不使用流量控制和拥塞控制;可靠传输,使用流量控制和拥塞控制。
    6)首部对比:首部开销小,仅使用8字节; 首部最小20字节,最大60字节。
    7)应用场景:UDP,包总量较少的通信,DNS和SNMP; TCP:FTP,HTTP和HTTPS

  3. TCP头格式

    1)序列号:本TCP报文段数据载荷的第一个字节序号–解决网络包乱序
    2)确认应答号:下一次期望收到的数据的序列号
    3)控制位:
    (1):ACK: 为1时确认应答字段有效。TCP建立连接之后,必须置为1
    (2):RST: 为1时,TCP出现异常必须强制断开连接
    (3):SYN:表示希望建立连接,(建立连接请求和建立连接请求的确定)
    (4):FIN: 希望断开连接,不再有数据发送

  4. 为什么需要TCP协议,TCP工作在那一层?
    1)IP层是不可靠的,不保证网络包的交付,按序交付和数据完整性。
    2)TCP在传输层,进行可靠数据传输的服务,确保接收到收到的数据包是无损坏,无间隔,非冗余和按序的。

  5. 什么是TCP?
    1)TCP是面向连接,可靠的,基于字节流的传输层控制协议
    2)面向连接(一对一进行传输),可靠的(保证报文一定能够达到接收端),字节流(消息是有序的,前面没有传完,后面不会接受)。

  6. 什么是TCP连接?
    客户端和服务端在三点信息上需要达成一致意见:
    1)Socket: IP地址(确定主机)端口号(确定应用进程)
    2)序列号:解决乱序问题,需要同步
    3)窗口大小:用来做流量控制

  7. 如何唯一确定TCP是一对一连接?
    1)原地址,源端口,目标地址和目标端口

  8. 为什么UDP头部没有首部长度字段,而TCP头部有首部长度?
    1)因为TCP可变长的选项字段,UDP是固定八个字节头部,不需要特别记录。

  9. 为什么UDP有包长度字段,而TCP头部没有包长度字段?
    1)TCP数据长度=IP总长度-IP首部长度 -TCP首部长度,前面两个在IP首部格式已知,后者在TCP首部格式已知。
    2)UDP是为了确保首部长度是4字节的整数倍。

1.2 TCP连接建立

TCP三次握手过程和状态的变迁(seq:序列号,ack:确认序列号)

  1. 三次握手过程
    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 (可携带数据)

  2. 三次握手状态变化
    1)发送前:两者都处于关闭状态closed
    2)要发送了,服务器端处于主动监听listen状态
    3)第一次握手:客户端发送连接报文后,处于syn_sent状态,表示已发送连接请求
    4)第二次握手:服务端收到消息之后,发送报文,处于syn_rcvd状态,表示已发送请求的确定
    5)第三次握手:客户端发送普通报文消息后处于established状态,服务端接收到消息后,也处于established状态。

  3. 为什么是三次握手,而不是两次和四次?
    1)三次握手才能保证双方具有接受法发送的能力
    2)通过三次握手,能够防止历史连接的建立(如果是历史连接,那么客户端会返回RST报文,而不是ACK,进行连接终止),较少双方不必要的资源开销(历史连接的建立),帮助双方同步初始化序列号
    3)两次为什么不行:无法防止历史连接的建立,会噪声双方资源的浪费,无法可靠同步双方序列号。
    4)为什么四次不行:三次握手就够了,四次就冗余了。

注意点:
1)在三次握手的时候,前两次报文中是不能携带数据的,最后一次可以。
2)如何在Linux系统中查看TCP连接状况:nestat -napt.
3)如果第三次握手,信息发送失败怎么办:服务端没有收到消息,就会重新发起第二次握手,重发之前的SYN+ACK(默认重发五次,之后自动关闭连接);客户端接受到消息后,再次进行第三次握手,如果第三次报文中有数据,则服务端会返回RST包响应。
4)如果连接已经建立,但是客户端出现问题怎么办:服务端每次和客户端进行连接会复位一个计时器,如果两个消息内,没收到服务端任何消息,则会发送探测报文段(75秒一次,发送10次),还是没有反应,则关闭连接。

  1. 为什么客户端和服务端的初始序列号ISN是不相同的?
    1)如果序列号相同,无法区分是现在报文还是历史报文,容易造成数据的混乱,第二点也为了防止黑客伪造相同序列号的TCP报文。

  2. 既然IP层会分片,为什么TCP还需要MSS:
    1)MTU:一个网络包的最大长度:IP头部,TCP头部和数据
    2)MSS:数据部分: MTU-IP头部-TCP头部
    3)当IP层有一个超过MTU大小报报文数据要发送,需要进行分片,但是IP层没有超时重传机制,报文丢失需要重新整个发送。
    4)TCP进行分片,约定之为MSS,故不需要IP进行分片。有超时重传机制,会针对丢失部分进行重传。,增加效率。

  3. 什么是SYN攻击,如何进行避免?
    1)SYN攻击:黑客伪造多个IP地址和SYN报文进行发送,服务端收到返回SYN报文,但是一直无法匹配连接在,占满服务器SYN接受队列, 使得服务器瘫痪。
    1)解决办法:
    (1):通过修改Linux内核参数,控制队列的大小和连接的最大数 / 当队列满时直接返回RST,丢弃连接。

1.3 TCP连接断开

TCP四次挥手过程和状态的变迁

  1. 四次挥手过程
    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:最长报文段寿命)

  2. 为什么需要四次挥手
    1)前两次挥手,进行单方面的断开。客户端不再发
    2)后两次挥手:服务端不再发送,关闭连接
    3)2MSL之后,旧连接发送数据全部发送完,客户端关闭。

  3. 为什么需要TIME_WAIT状态
    1)防止旧连接的数据包
    2)保证连接正常关闭

  4. TIME_WAIT过长的危害
    1)内存资源占用
    2)端口资源占用

1.4 Socket编程

2. TCP重传,滑动窗口,流量控制和拥塞控制

2.1 TCP重传机制

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示收到消息。

**重传机制有:**超时重传,快重传,SACK和D-SACK。

  1. 超时重传:发送数据时,设定一个计时器,当超过指定时间,没有收到对方的ACK确认应答抱回,会重新发送数据。
    1)发生时刻:数据包丢失和确认应答丢失
    2)超时重传时间选择:超时重传时间为RTO,数据从网络一端传到另一端时间为RTT,RTO应该需要略大于RTT。

  2. 快重传:当收到三个相同的ack=x报文之后,会在定时器过期之前,重传丢失的seq=x包;
    1)存在问题:不知道ack=x报文是谁传回来的,所以重传,是重传之前的一个,还是重传所有问题。

  3. SACK重传:可以将缓存的地图发送给发送方,这样就知道哪些数据收到了,哪些数据没收到,只重传丢失的数据。

  4. Duplicate SACK重传 :在SACK基础上携带额外信息,告知发送方有哪些数据包自己重复接收了。

2.2 TCP滑动窗口

解决发送方发出一个数据,在收到接收方收到确定信息才能发送下一个信息的问题。
1)引入窗口概念:及时数据往返时间较长,它也不会降低网络通信的效率。
2)窗口大小:无需等待确认应答,而可以继续发送数据的最大值。
3)匹配:发送端的滑动窗口和接收端的滑动窗口需要匹配。

2.3 流量控制

流量控制:让发送方的发送速率不要太快,要让接收方来得及接收。

  1. 怎样进行流量控制
    1)利用滑动窗口可以有效对发送方进行流量控制。滑动窗口的值与接收方内存大小相关。
    2)TCP接收方利用自己的接收窗口的大小限制发送方发送窗口的大小
    3)TCP发送方收到接收方的零窗口通知后,应启动持续计时器,计时器超时,向接收方发送零窗口探测报文

  2. 存在问题:如果发送方一直在等待接收方的非零窗口通知,接收方的非零窗口通知一直发不出去,会导致死锁,怎么解决
    1)存在一个持续计时器,如果一直没有收到接收方的非零窗口通知,会发送一个零窗口探测报文,进行探测,打破死锁局面。

2.4 拥塞控制

  1. 拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就会变。
  2. 危害:网络拥塞不进行控制,网络吞吐量将会随着输入负荷增大而降低
  3. 出现网络拥塞依据:没有按时收到应当到达的确认报文,即发生超时重传。
  4. 拥塞控制的四种方法:
    (拥塞窗口cwnd作为发送窗口,慢开始门限ssthresh)
    1)慢开始算法:当cwnd<=ssthresh,使用慢开始策略,每一次cwnd扩大到原来的两倍。
    2)拥塞避免算法:当cwnd>=ssthresh时,使用拥塞避免算法,cwnd每一次加一;当出现拥塞的时候,慢开始门限ssthresh更新为此时拥塞窗口大小的一半,且拥塞窗口置为1,启动慢开始方法。
    3)快重传算法
    问题:发生超时重传,不一定是发生了拥塞,也可能是传递出错了。
    解决办法:快重传,当出现三次连续的重复确认,就不等超时重传计时器超时,即刻进行数据重传。
    4)快恢复算法:发送方将ssthresh和cwnd都调整为当前窗口一半,执行拥塞避免算法。

2.5 TCP如何保证数据的可靠传输

  1. 数据进行分割为数据块,打包发送
  2. 校验和:检验数据是否传输错误
    
  3. 流量控制
  4. 拥塞控制:慢开始算法,拥塞避免算法,快重传和快恢复算法。
  5. 超时重传,快重传

参考内容:小林图解计算机网络

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值