5分钟详细的理解TCP/IP协议工作原理

举报
rivers 发表于 2022/04/02 23:02:21 2022/04/02
【摘要】 最近有粉丝和我私信,说面试被问到TCP/IP协议,被问懵圈了,面试的时候只有准备充足了,才可能顺利通关,TCP/IP让你讲你可能说的不是很清楚,但是给你看下TCP/IP,你可能就明白了。但是为了面试,我们还是要去理解记忆,如何理解的去认识TCP/IP呢?下面博主就TCP/IP协议详细的介绍下吧

1 TCP 报文简介

  • TCP:一种面向连接的、可靠的传输层通信协议,由IETF的RFC 793定义。它提供全双工和可靠的交付服务

  • UDP:一种简单的无连接的传输层协议,由IETF的RFC 768定义。

2 TCP 协议的特点

  • 面向连接的:因为程序在使用TCP协议提供的服务时,需要先建立 TCP连接
  • 可靠交付:确认重传,无差错、不丢失、不重复
  • 面向字节流: “流”指的是 流入到进程或从进程流出 的字节序列。有序的

3 TCP报文格式

  • # 常见字段说明
    
    #序列号:随机数作为其初始值
    在建⽴连接时由计算机⽣成的随机数作为其初始值,通过SYN 包传给接收端主机,每发送⼀次数据,就
    「累加」⼀次该「数据字节数」的⼤⼩。⽤来解决⽹络包乱序问题。
    
    #确认应答号:指下⼀次「期望」收到的数据的序列号
    指下⼀次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数
    据都已经被正常接收。⽤来解决不丢包的问题。
    控制位:
    ACK:该位为  1 时,「确认应答」的字段变为有效,TCP 规定除了最初建⽴连接时的  SYN 包之外该位必须设置为  1RST:该位为  1 时,表示TCP 连接中出现异常必须强制断开连接。
    SYN:该位为  1 时,表示希望建⽴连接,并在其「序列号」的字段进⾏序列号初始值的设定。
    FIN:该位为  1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双⽅的主机之间就可以相互交换  
    URG 紧急指针字段,URG=1,表明紧急指针字段有效。
    FIN 位为1TCP 段。
    
    ACK 确认号,ACK=1,确认应答有效
    

4 TCP 三次握手

  • TCP三次握手图

    ⼀开始,客户端和服务端都处于  CLOSED 状态。先是服务端主动监听某个端⼝,处于  LISTEN 状态
    
    
    1.客户端:发起请求连接 SYN=1,并随机产生一个序列号Seq,这里以100为 例。 进入 SYN-SENT 发送状态
    2.服务端:建立TCP连接,发送SYN=1,随机产生自己的seq,这里以200为 例。同时,给客户端发送有效确认位ACK=1,并告知下次 从哪里获取序列号 ack=seq+1(上一次的seq) ,进入 syn-sent发送状态
    
    3.客户端:确认收到 发送ACK=1.ack=2001 ,进入 established转态,完成三次握手。前2次不带数据,第三次是可以带数据的
    
    
    ACK :确认位 ,表示是否收到
    ack:确认号,表示下一次期待收到数据的序列号
    

5 TCP 四次分手

  • 四次分手图

    1. 客户端主动发起释放连接 FIN=1 ,加上自己现在的seq,进入fin-wait转态
    2.服务端 接收到后,进行确认位ACK=1(表示自己收到请求了),同时 加上自己的序列号seq,及下次期待从哪里断开确认好ack=seq+1(上一次的seq),进入 close-wait转态
    3.数据接收完毕后,服务器 会主动发送 FIN=1释放连接,ACK=1,同时加上自己的seq,及确认号 ack=seq+1 进入 close-wait转态,等待服务端处理完数据后,也向客户端发送  FIN 报⽂,之后服务端进⼊  LAST_ACK 状态。
    
    
    4.客户端收到后,ACK=1 确认收到了,然后发送seq,及确认号 seq+1(上一次的seq),
    # 这⾥⼀点需要注意是:主动关闭连接的,才有TIME_WAIT 状态。
    
    
    户端收到服务端的  FIN 报⽂后,回⼀个  ACK 应答报⽂,之后进⼊  TIME_WAIT 状态
    服务器收到了  ACK 应答报⽂后,就进⼊了  CLOSED 状态,⾄此服务端已经完成连接的关闭。
    客户端在经过  2MSL ⼀段时间后,⾃动进⼊  CLOSED 状态,⾄此客户端也完成连接的关闭。
    

6.常见的面试问题

6.1 为什么需要TCP 协议?TCP ⼯作在哪⼀层?

  • # IP  层是「不可靠」的,它不保证⽹络包的交付、不保证⽹络包的按序交付、也不保证⽹络包中的数据的完整性。如果需要保障⽹络数据包的可靠性,那么就需要由上层(传输层)的  TCP 协议来负责。
    
    #因为TCP 是⼀个⼯作在传输层的可靠数据传输的服务,它能确保接收端接收的⽹络包是⽆损坏、⽆间隔、⾮冗余和按序的。
    

6.2 为什么是三次握⼿?不是两次、四次?

  • # 因为三次握⼿才能保证双⽅具有接收和发送的能⼒ ---不全,详细如下:
    
    列号。序列号能够保证数据包不᯿复、不丢弃和按序传输。
    #在前⾯我们知道了什么是 TCP 连接:
    ⽤于保证可靠性和流ᰁ控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗⼝⼤⼩称为连
    接。所以,᯿要的是为什么三次握⼿才可以初始化Socket、序列号和窗⼝⼤⼩并建⽴TCP 连接。
    
    #接下来以三个⽅⾯分析三次握⼿的原因:
      三次握⼿才可以阻⽌重复历史连接的初始化(主要原因)
      三次握⼿才可以同步双⽅的初始序列号
      三次握⼿才可以避免资源浪费
      
    # 在我们来看看RFC 793 指出的TCP 连接使⽤三次握⼿的⾸要原因:是为了防⽌旧的重复连接初始化造成混乱。
    
    # TCP 协议的通信双⽅, 都必须维护⼀个「序列号」, 序列号是可靠传输的⼀个关键因素,接收方按序接受,去除重复的序列号。
    
    
    # 如果只有「两次握⼿」,当客户端的  SYN 请求连接在⽹络中阻塞,客户端没有接收到  ACK 报⽂,就会重新发送  SYN ,由于没有第三次握⼿,服务器不清楚客户端是否收到了⾃⼰发送的建⽴连接的  ACK 确认信号,所以每收到⼀个  SYN 就只能先主动建⽴⼀个连
    
    
    小结:# TCP 建⽴连接时,通过三次握⼿能防⽌历史连接的建⽴,能减少双⽅不必要的资源开销,能帮助双⽅同步初始化序
     # 两次握⼿:⽆法防⽌历史连接的建⽴,会造成双⽅资源的浪费,也⽆法可靠的同步双⽅序列号;
     # 四次握⼿:三次握⼿就已经理论上最少可靠连接建⽴,所以不需要使⽤更多的通信次数。
    

6.3 为什么客户端和服务端的初始序列号ISN 是不相同的?

  • # 如果⼀个已经失效的连接被重复⽤了,但是该旧连接的历史报⽂还残留在⽹络中,如果序列号相同,那么就⽆法分辨出该报⽂是不是历史报⽂,如果历史报⽂被新的连接接收了,则会产⽣数据错乱。
    
    

6.4 初始序列号ISN 是如何随机产⽣的?

  • # 起始  ISN  是基于时钟的,每4 毫秒+ 1,转⼀圈要4.55 个⼩时。
    # RFC1948 中提出了⼀个较好的初始化序列号ISN 随机⽣成算法。
       ISN = M + F (localhost, localport, remotehost, remoteport)
    
    M 是⼀个计时器,这个计时器每隔4 毫秒加1F 是⼀个Hash 算法,根据源IP、⽬的IP、源端⼝、⽬的端⼝⽣成⼀个随机数值。要保证Hash 算法不能
    被外部轻易推算得出,⽤MD5 算法是⼀个⽐较好的选择。
    
    

6.5 什么是SYN 攻击?如何避免SYN 攻击?

  • #我们都知道TCP 连接建⽴是需要三次握⼿,假设攻击者短时间伪造不同IP 地址的  SYN 报⽂,服务端每接收到⼀个  SYN 报⽂,就进⼊SYN_RCVD 状态,但服务端发送出去的  ACK + SYN 报⽂,⽆法得到未知IP 主机的
    # ACK 应答,久⽽久之就会占满服务端的SYN 接收队列(未连接队列),使得服务器不能为正常⽤户服务。
    

6.6 为什么挥⼿需要四次?

  • # 再来回顾下四次挥⼿双⽅发  FIN 包的过程,就能理解为什么需要四次了。
    关闭连接时,客户端向服务端发送  FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
    服务器收到客户端的  FIN 报⽂时,先回⼀个  ACK 应答报⽂,⽽服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送  FIN 报⽂给客户端来表示同意现在关闭连接。
    从上⾯过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的  ACKFIN ⼀般都会分开发送,从⽽⽐三次握⼿导致多了⼀次。
    

6.7 为什么需要TIME-WAIT?进入TIME-WAIT,再等2倍的MSL呢?TIME_WAIT 过多有什么危害?

  • 1. # 原因⼀:防⽌旧连接的数据包、原因⼆:保证连接正确关闭
    
    2. # 2MSL 的时间是从客户端接收到FIN 后发送ACK 开始计时的。如果在TIME-WAIT 时间内,因为客户端的ACK
    没有传输到服务端,客户端⼜接收到了服务端᯿发的FIN 报⽂,那么 2MSL 时间将重新计时。
    
    #如果最后一个ACK发过去失败了,那显然服务端没收到,就不能进入closed,此时服务端会重发上一条FIN-ACK报文,那你客户端已经关闭了,显然不合适吧。素以这个2SML正好就是来往一圈的时间,确保服务器能收到最后一条ACK。同时,这个过程还能确保一些异常的数据在网络中消失,不会影响到下一次通信。
    
    3.#  第⼀是内存资源占⽤; 第⼆是对端⼝资源的占⽤,⼀个TCP 连接⾄少消耗⼀个本地端⼝;
    
    

6.8 TCP 是⼀个可靠传输的协议,那它是如何保证可靠的呢

  • # TCP 是通过序列号、确认应答、重发控制、连接管理以及窗⼝控制等机制实现可靠性传输的
    
    # 重点介绍TCP 的重传机制、滑动窗⼝、流量控制、拥塞控制
    重传机制:超时重传、快速重传、SACK方法
    滑动窗⼝:指定窗⼝⼤⼩,窗⼝⼤⼩就是指⽆需等待确认应答,⽽可以继续发送数据的最⼤值。
    流量控制:窗口关闭(如果窗⼝⼤⼩为0 时,就会阻⽌发送⽅给接收⽅传递数据,直到窗⼝变为⾮0 为⽌
    拥塞控制:慢启动、拥塞避免
    
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。