TCP/IP协议详解

  •   TCP/IP模型

层次

  1. 应用层:Http、FTP协议
  2. 传输层:TCP/UDP协议
  3. 网络层:IP协议,负责对数据加上IP地址和其他的数据以确定传输目标
  4. 网络接口层:以太网协议
  • 数据链路层

    三个基本问题:封装成帧、透明传输、差错检测。

    封装成帧:把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址。

    透明传输:零比特填充、转义字符。

    透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。

    可靠传输:在出错率很低的链路上很少用,但是无线链路WLAN会保证可靠传输。

    差错检测(CRC):接收者检测错误,如果发现差错,丢弃该帧。

  •  

     

  • 网络层
  • IP协议
    1. IP地址
  • IP地址是由网络号(net ID)与主机号(host ID)两部分组成的。

     

     

     

    其中127.x.x.x段地址空间是被保留的回环地址

    因为B类地址是10开头,所以第一个8位是从10000000 开始,所以是128开头

    为什么常见有198和172开头的地址?

    在IPV4协议中预留了3个IP地址段作为私有地址,供组织内部使用,每个组织都可以使用。

    A类地址:10.0.0.0--10.255.255.255

    B类地址:172.16.0.0--172.31.255.255

    C类地址:192.168.0.0--192.168.255.255

    00001010 00000001 00000001 00000000

    11111111 11111111 11111111 00000000

    广播地址

    IP地址的主机号为全1,就是广播地址

  • 子网掩码的计算

  • 根据主机数量
  • 将主机数目转换成二进制表示(注:网络地址和广播地址还有网关都要占一个,所以如果有35台电脑,就应该有38个主机)
  • 得到主机数目二进制位数N
  • 将默认子网掩码的主机地址部分都变成1,然后从后往前,将N位置0。
  •  

  • 根据子网数
  • 将子网数目用二进制表示
  • 得到子网数目二进制的位数N
  • 将IP地址主机地址部分的前N位置1
  • 例如:B类地址168.198.0.0划分成27个子网

    因为27=11011,所以是5位,N=5

    主机地址是后面16位,前5位置1,子网掩码网络地址部分都是1,所以结果是

    11111111 11111111 11111000 00000000即255.255.248.0

  • 子网掩码的意义

    转换成二进制后为1的部分表示网络号,为0的部分表示主机号。

    IP段/数字

    如192.168.0.1/24,24表示了前24位是网络位,子网掩码也就是相应的前24位为1

  •  

    A类地址

    网络地址有8位,但第一位取0,而且剩下七位中,全1和全0都是保留地址。所以是27-2=126个。

    IP地址与MAC地址,为什么有了IP地址还需要MAC地址?

    IP地址相当于你目前住的地址,而MAC地址就相当于你的身份证。IP地址与地域有关,通过IP地址就能去到指定的地点。

  •  

     

     

    1. IP协议头

       八位TTL:该字段规定了数据包在穿过多少路由后会被抛弃。每穿过一个路由器,就会减1,到TTL为0,它就会被自动抛弃,最大值为255.

 

2.ARP及RARP协议

ARP(地址解析)协议:ARP协议是根据IP地址获取MAC地址的一种协议。

当主机要发送一个IP包时,会首先查一下自己的ARP高速缓存(一个IP-MAC地址对应表缓存)。如果查询的IP-MAC值对不存在,主机就向网络发送一个ARP协议广播,里面有待查询的IP地址。收到广播包的某一个主机发现自己符合条件,那么久准备好一个包含自己的MAC地址的ARP包传送给原主机。

广播主机拿到ARP包后会更新自己的ARP缓存,发送数据包。

RARP协议与ARP协议相反,是根据MAC地址获取IP地址。

注:ARP和RARP协议都只能作用于局域网,当要发送数据给不同网络的主机,首先根据IP地址得知这不是同一个网络的主机。于是就将数据包发给网关,原IP和MAC都是发送主机,目的IP是要发的主机,目的MAC就是网关的。如果没有网关MAC就利用ARP广播。

网关得到数据包后,知道不是发给自己的,于是将原MAC地址更改为网关的,目的MAC地址更改为下一跳路由器。

 

3.ICMP协议

IP协议不是可靠的协议,无法保证数据被送达。所以传送IP数据包发送错误时,ICMP协议将会把错误信息封包,发还给主机。

ICMP报文种类:

差错报文

目的站不可达报文

数据报超时报文:比如TTL为0

 

查询报文

该报文用于确定两个网络设备之间是否能够正常通讯。主机或路由器向某个目的主机发送ICMP回送请求报文,任何收到回送请求的目的主机都会生成一个回送应答报文,并发返回给源主机。

 

4.Ping

Ping的本质是ICMP回送请求报文和回送应答报文。是ICMP最著名的应用

 

5.Traceroute

用来检测主机到目的主机之间经过路由情况的工具。

收到目的主机的IP后,首先发一个TTL=1的UDP数据包,经过的第一个路由器会将TTL-1,变成0后就会抛弃,同时产生一个主机不可达的ICMP数据包发给主机。主机收到该数据包后再发生一个TTL=2的UDP数据报给目的主机,刺激第二个路由器给主机发ICMP数据报。如此循环,traceroute就拿到了所有路由器的IP。

 

6.TCP/UDP

TCP/UDP都是传输层协议。

面向报文:面向报文的传输方式是应用层交给UDP多长的报文,UDP发生多长的报文,即一次发生一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率;若太短,会使IP数据报太小

面向字节流:虽然应用程序和TCP的交互是一次一个数据块,但TCP把程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传输的数据太长,TCP就可以把它划分短一些再传送。

什么时候应该使用TCP?

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

什么时候应该使用UDP?

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。

 

7.DNS

DNS(域名系统)是因特网上作为域名和IP地址互相映射的一个分布式数据库,用于将主机名和域名转换为IP地址。DNS运行在UDP协议上(意思就是通过发送UDP报文获取IP地址),使用端口号53。

 

  1. TCP连接的建立和终止
  • TCP是面向连接的服务,所以在发送数据之前一定要建立连接。TCP协议提供可靠的连接服务,通过三次握手建立连接。三次握手的目的是同步 连接双方的序列号和确认号并交换TCP窗口大小信息。

    两个序号和三个标志位

  • 序号:seq,用来标识从TCP源端向目的端发送的字节流,发送方发送数据时对此进行标记。
  • 确认序号:ack,只有ACK(区分大小写)标志位为1时,确认序号才有效,ack=seq+1。确认方ack=发起方seq+1
  • 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN
        1. URG:紧急指针(urgent pointer)有效
        2. ACK:确认序号有效
        3. PSH:接受方应该尽快将这个报文交给应用层
        4. RST:重置连接
        5. SYN:发起一个新连接
        6. FIN:释放连接
  • 握手过程(从主机A到B)

  • 第一次握手
  • A随机选取一个序列号x作为初始序号seq,SYN=1。然后主机A进入SYN_SEND状态,等待B确认。

  • 第二次握手
  • B收到SYN报文段,选择一个随机数y作为seq,并且将ack=x+1,发送一个SYN/ACK报文,进入SYN_RECV状态

  • 第三次握手
  • A收到B的回信后回复一个ACK确认报文,seq=x+1,,ack=y+1。发送完毕后客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

     

     

     

     

     

    为什么A还要确认一次,两次不就够了吗?

    为了防止已失效的连接请求突然又发送到服务端。

    例如:A发送的第一个连接请求报文因为丢失而没有收到确认,于是A又重发了一次连接请求。第二次请求成功,数据传输完毕后就释放了连接。

    但是有可能A发出的第一个连接请求报文段并没有丢失,而是再某些网络节点长时间滞留了,后来又传到了B。本来这是个失效的请求,但B受到报文,误以为A想建立连接,于是向A发出确认报文段,同意建立连接。

    如果没有三次握手,新的连接就建立了。但A因为没有发出请求,因此不会理睬B的确认。但B以为连接已经建立,就会一直等待A发来数据,B的资源就这样被浪费了。

    如果采用三次握手,A不会向B发出确认,B没有收到确认,也就不会认为A想建立连接。

     

    四次挥手过程

    (哪一方发送了FIN,哪一方就不会再发送数据)

    假设A要断开连接

    第一次挥手(A)

    A发送一个FIN报文,A进入FIN_WAIT_1状态,FIN=1,seq=x

    第二次挥手(B)

    B收到FIN(释放连接)报文后立即发出ACK(确认报文),ACK=1,seq=y,ack=x+1。B进入CLOSE_WAIT状态

    A收到B的确认后进入FIN_WAIT_2状态,等待B的FIN报文

    第三次挥手(B)

    B发出FIN/ACK报文,FIN=1,ACK=1,seq=z,ack=x+1,B进入LAST_ACK(最后确认)状态,等待A的确认

    第四次挥手(A)

    A收到B的FIN/ACK报文后,发出ACK报文,ACK=1,ack=z+1,seq=x+1,

    A进入TIME_WAIT状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL(最长报文段寿命Maximum Segment Lifetime)后,A才进入CLOSED状态。

     

    为什么要四次分手

    TCP是面向连接的、可靠的全双工协议。

    A向B第一次挥手后表示A没有要向B发送的报文。

    B的第二次挥手表示我已经知道你没有东西发了,但是我可能还有东西给你,你先等等。

    B的第三次挥手表示,我也没话和你说了,我们可以断开了。

    A的第四次挥手表示,确认可以断开,告诉B。然后等2MSL时间。A在2MSL时间后就可以断开了。B在收到A的最后一次挥手后就直接断开。

    如果没有第四次挥手,B在第三次挥手后直接断开,如果A没有收到,那么A就会一直等待。所以第四次挥手是为了确保TCP协议是面向连接的安全协议。

     

    为什么要等待2MSL

  • 如果A的第四次挥手B没有收到,B就会重发第三次挥手。所以A要等待2MSL时间。
  • 为了让这次连接产生的滞留报文、所有数据失效。以免新建立的连接端口和断开连接端口一样,(有可能,不一定)之前滞留在网络中的报文又发送到B了,TCP协议误以为这是本次发送的报文,这样就和新的报文混淆了。
  •  

     

     

     

    9.TCP流量控制

    为了防止发送方把数据发送过快,接受方来不及接收,造成数据丢失。

    利用滑动窗口机制。

    发送缓存:发送窗口是发送缓冲区的一部分,是可以被TCP协议发送的部分

  • 已发送并收到确认的数据(不在发送缓冲区和发送窗口了
  • 已发送但未收到确认的数据(位于发送窗口
  • 允许发送但未发送的数据
  • 发送窗口外发送缓冲区内暂时不允许发送的数据

  •  

     

    接收缓存

  • 已接收
  • 未接收但准备接收(接收窗口)
  • 未接收而且不准备接收
  •  

    滑动机制(https://blog.csdn.net/yao5hed/article/details/81046945)

  • 发送窗口只有在收到接收窗口发来的ACK确认,才会移动窗口左边界
  • 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不会后序字节确认。以确保另一边会重传数据
  • TCP为每一个连接都设有持续计时器。当发送方收到接受方零窗口通知也就是不能发送数据时,发送方停止发送,并启动持续计时器。若持续计时器到期,发送一字节的探测报文,接收方会回应接收窗口大小,若不为0则发送数据,否则重设计时器,继续等待。
  •  

 

10.拥塞控制

为了防止过多的数据注入网络中,使网络中的路由器和链路过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。

  1. 慢开始和拥塞避免

发送方维持一个拥塞窗口。拥塞窗口的大小取决于网络的拥塞程度,并且在动态的变化。发送方让自己的发送窗口等于拥塞窗口。

发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就增大一些。反之亦然。

慢开始算法

把拥塞窗口设置一个最大报文段MSS(Maximum Segment Size,最大报文长度)大小。每收到一个发生报文确认后,就把拥塞窗口增大1,2n指数增长。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。

一个传输轮次所经历的时间其实就是往返时间RTT。

为了防止拥塞窗口增长过大,还需要设置一个慢开始门限ssthresh。

当cwnd(拥塞窗口)<ssthresh,使用慢开始算法

当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法

当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

 

拥塞避免

类似慢开始算法,不过每次增加1

 

无论是慢开始还是拥塞避免,只要发送方判断网络出现拥塞(没有收到确认),就要把慢开始门限ssthresh设为此时(出现拥塞时)拥塞窗口大小的一半,但不能小于2。然后把拥塞窗口大小设为1,执行慢开始算法。

 

  1. 快重传和快回复

一条TCP连接有时会因为等待重传计时的超时而空闲较长时间,慢开始和拥塞避免无法解决这类问题,因此提出了快重传和快恢复的拥塞控制方法。

 

快重传

快重传算法要求首先接收方收到一个失序的报文段后立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认,如下图

但按照快重传算法的规定,接收方应及时发送对M2的重复确认,这样做可以让发送方及早知道报文段M3没有到达接收方。发送方接着发送了M5和M6。接收方收到这两个报文后,也还要再次发出对M2的重复确认。这样,发送方共收到了接收方的四个对M2的确认,其中后三个都是重复确认。

快重传算法还规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段M3,而不必 继续等待M3设置的重传计时器到期。

快恢复

与快重传配合使用的还有快恢复算法,其过程有以下两个要点:

当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。

与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为 慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值