一些关于TCP,UDP,IP的理解

  • 认识IP地址

IP地址是互联网上唯一标识一台网络设备的一串32位二进制数字(这是IPV4,IPV6为128位(16个字节)以下都是默认IPV4),由网络号和主机号组成。

网络号:标识网段,唯一表示一个网段。

主机号:标识主机,同一网段下只能有唯一的主机号。

曾经把IP地址分为了五类。

D类用于广播,E类用于实验或者留于以后。

为什么主机号要减去2,在主机号全为0是结合前面的网络号就成了一个网络号(有点拗口,可以认为是一词多用比如张德帅是他的名字,德帅也是),代表这个局域网。主机号全为1时是广播地址用于给同一个链路(同一个二层域,同一网段)。

127开头的主要用于本机环回测试。

  • 子网掩码

在后来人们为了增加网络数量和减少主机号的浪费。由前面的1和后面的0组成,1的部分就是网络号。毕竟其实主机号的分配是用不完的,倒不如减少主机号增加网络号的数量

  • MAC地址

MAC地址是一个物理地址,属于硬件层次在不同节点的选择时就靠他来标明来路和去向。

  • 网络设备及其相关技术

这里的端口指的是设备上的物理的端口

集线器:负责数据单纯转发给其他所有的端口,注意这个所有是必须得

交换机:将数据报通过MAC地址转换表发送到对应端口,交换机也可以转发给所有端口但不是强制的

主机:负责封装

路由器:网关负责划分公网和局域网,路由: 通过算法规划一条数据传输路线。

  • 网络数据传输流程
  1. 集线器
  1. 封装数据报,在数据链路层的时候在本机ARP缓存中查找对应的MAC
  2. 如果找到就直接发送,找不到就发个ARP广播通过集线器来去一个一个问。找到后就保存IP与MAC的映射。
  1. 交换机

交换机内保存了MAC地址转换表

  1. 封装数据报,在数据链路层的时候在本机ARP缓存中查找对应的MAC
  2. 如果找到就直接发送,找不到就去交换机中的地址转换表找,再找不到就发个ARP广播通过来去一个一个问。找到后就保存IP与MAC的映射。
  1. 交换机+路由器
  1. 封装数据报,在数据链路层的时候先通过本机掩码来判断目的IP与源IP是否处在同一网段
  2. 在的话就当只有交换机参与,不在的话把目的MAC改为路由器发送数据报给路由器,让路由器作为源IP,路由器通过ARP寻址(找到对应网段,在让对应的集线器去问),此时的源MAC就是路由器的目的MAC就是目的主机的。
  3. 发送给目的主机
  1. 广域网
  1. 讨论当数据传输处于不同网段时,
  2. 不在的话就发送给路由器,路由器就通过公网(也会修改IP和端口)把数据发送下去,基于路由表来计算路线,找到下一个设备,知晓下一个设备的MAC也是通过ARP。

UDP协议

UDP数据报为十个字节,报头八个字节分为源端口,目的端口,UDP报文长度(整个数据报),校验和(通过某种运算(比如CRC,MD5,SHA1)得到的载荷的映射,极难逆运算出来),载荷两个字节。

UDP天然支持广播。

TCP协议

  1. 源端口和目的端口。
  2. 32位序号:在发送数据时会对数据报进行编号,一个字节一个字节的递增,第一个字节的序号为这个序号,当第二次发送的时候也是跟着这个序号开始递增,每一次连接为一个周期,当断开连接后重新编号,这个重新开始的编号是经过协商的。
  3. 32位确认序号:我们都知道TCP是一个可靠传输,当我们发送数据时如何知道数据是否发送过去了,就要目的主机发送回一个应答报文(里面的ACK标志位为一),应答报文里的确认序号就是它对应的报文的最后一个字节的序号+1.这代表两层含义,一是下一段报文要从这里开始,二是这之前的报文都已经核对过了。
  4. 4位首部长度:以4字节作为单位,0001就是4字节,0010就是8字节。
  5. 保留位(留着以后万一有用就不用改太多东西了)
  6. 16位窗口大小 为了提高数据报传输量(减少等待ACK的时间)采用的批量发送数据的一批次的大小。
  7. 16位校验和与UDP的一样
  8. 16位紧急指针:标识那部分是紧急数据,在网卡里数据的读入是一批一批的读,如果接收到了紧急指针就会立刻读入到对应的地方
  9. 选项
    1. MSS: 期望数据长度(不包括TCP,IP的报头)
    2. WSOPT: 拓展滑动窗口的窗口长度

TCP10个核心机制

  1. 确认应答:通过应答报文来确认是否收到
  2. 超时重传:当数据在传输时发生意外,无论是发送出去时目的主机没接收到,还是应答报文没接收到(在规定时间内没接收到)都统一视为丢包。这时目的主机就会尝试再次发送这个数据报,此时就会产生一个问题,如果是发送的数据报丢失那无所谓,如果是应答报文丢失,那么就会发送两端报文给接收方。首先接收方会在缓冲区(一个类似堆的数据结构)可以按照序号对报文进行排序也可以去重解决了刚才的问题。

上面两点也是TCP可靠性的主要原因。

  1. 连接管理:通过一份空间(数据结构)记录对面的IP和端口形成一种抽象的连接,断开连接就是把这份数据给删除了。
  2. 滑动窗口:比如窗口大小是4,那么主机A可以一次性发送四个数据报给主机B然后一起等待ACK,每当接受当一条ACK就发送一条新的数据报。显然这其中会出现丢包之类的情况,当发生丢包时,B就会把发送给A的ACK的确认序号改为丢包的那个数据报的序号,直到B接收到该数据包。这和超时重传有点类似,不同的是超时重传是A发起的,快速重传是B向A索要,当索要三次以后A就会主动发送丢失数据,如果在找回丢失数据时又丢了那么就会在找回后接着这个丢失的在进行一样的操作。
    1. 如何确认丢失呢,通过序号的不连续
  3. 流量控制:窗口大小的控制由流量控制和下面的拥塞控制中较小的决定。通过衡量接收方的能力来给A一个参考的窗口大小。这个衡量的方法有两个,1是看每一秒B处理数据报的能力(这个太复杂了,因为机器上的进程和其他因素太多了)2看缓冲区剩余空间大小。在TCP报头的组成里有一个16位窗口大小,这个并不是固定的可以由选项中来进行扩展。
  4. 拥塞控制:负责衡量节点的传输能力,通过合理但不固定的增长来控制窗口的大小。让窗口尽量在一定时间内相对稳定的传输更多的数据。
  5. 延时应答:通过让B晚点返回ACK争取更多时间来处理数据报(有一种欺骗的感觉在),返回的窗口大小就会更大。并且也会从中节省一些ACK,毕竟ACK的一个作用就是告诉A前面的数据报都已经处理完了。
  6. 捎带应答:不一定会执行,当ACK和数据报恰好发送时机差不多的时候就会合并(类似四次挥手的中间两次)。
  7. 面向字节流:粘包问题,当B读取A的字节时,无法确定A的数据报是多大的,这时就会产生多读或者少读的问题,解决方案有两个1约定一个不可能被使用的分割符,2在载核里说明长度。
  8. 异常情况:
  1. 进程终止:当进程关闭后,会尝试进行四次挥手但不一定执行完毕,主要看主机有没有重新启动这一进程
  2. 主机关机:正常关机也是要先杀进程(进程终止)
  3. 主机掉线:分为两个情况1发送方掉线,等待ACK,超时重传,尝试复位,最后单方面放弃这个连接。2接收方掉线,先等待,等不到就周期性的发一个心跳包,还没有回应就证明发送方挂了,放弃连接
  4. 拔掉网线:这个就相当于双方都挂了。

我们先介绍一下IP协议

  1. 4位版本号:表示这是IPv4还是IPv6
  2. 4位首部长度:表示这个IP报头的长度,可以看到IP报头也有一个选项,这就说明报头的长度不固定,单位是4字节。
  3. 8位服务类型:其实只有四位有效,且这四位只有一个1和三个0。1的位置说明了是什么类型(感觉像手机模式,什么性能模式,省电模式)分别是:最小延时,最大吞吐量,最高可靠性,最小成本。值得一提的是这个模式其实是从代码层次上来进行的优化,有效果但不高,远不如从硬件方面更有效果。
  4. 16位总长度:整个数据报的长度,大小是64k这是否说明我们的数据报在应用层一次只能往下传64k以内的数据,并不是,在网络层他会对我们的数据报进行自动的拆分和组合。
  5. 16位标识:如果是同一份数据被拆分了,那么他们的标识是一样的。
  6. 3位标志:第二位表示是否分片,第三位表示是否为最后一个片。
  7. 13位片偏移量:拆分的顺序
  8. 8位生存时间:我们知道在网络传输时要经过许多节点,当这个数据经过一个节点时TTL就会-1当TTL为0时这个数据报就认为时找不到目的地的数据报被丢弃了。
  9. 8位协议:描述是数据载核是属于哪个协议,要知道我们虽然一直讨论TCP和UDP但实际上传输层有着许多的协议这只是冰山一角。
  10. 16位首部校验和:看看IP协议头部对不对,如果不对那就丢弃了,等着传输层做决定,看看是重发还是不管了。载核已经有了自己的校验和。
  11. 32位源IP:发送方的IP,当无法在路由器找到目的IP就会把源IP改为路由器的IP
  12. 32位目的IP:要到达的目的地

 IP的两大功能

  1. 地址管理

32位代表只有42亿9千万多的IP地址这远远不够我们使用,为了解决这个问题,大佬提出了三种方法1.动态分配:这么多设备总不能都在同时使用吧,当不用的时候就分配给其他的主机。2.NAT网络地址转换用一个IP代表一篇区域的网络设备再用端口号来区分不同的设备。在NAT条件下IP分为内网(私有)(10*,172.16.*到172.31.*,192.168.*)和外网(公网)(除内网都是)。公网是唯一的,而不同内网间的IP可以相同,内网和外网间无法直接的互相访问得通过路由器来进行映射/通过端口号来区分查找。3.IPv6直接本质上增加IP的数量42亿*42亿*42亿*42亿=>天文数字(但是目前除中国外还未普及,我国也只是有但还没开始全面使用)。

我们知道IP地址由网络号和主机号组成其中网络号和主机号的位数是由子网掩码来表明的(很早以前是把他们分成5类)当主机号为0时IP地址就变成了网络号当主机号变为1时IP地址就成了广播地址。

如果我们经常去看路由器就会发现他有几个接口,我们这里只讨论WAN口和LAN口。WAN口是与上层网络设备进行连接的一个接口,LAN口将下层网络设备进行连接的接口。不难看出WAN口一般只有一个而LAN口就有很多个。

路由选择

由于网络设备太多太多,一个路由器无法知道所有节点所以当一个数据报经过他时,他只能通过算法(很复杂不细说)来给数据报一个大致的方向让他去别的网络设备哪里问问(路由器里的路由表如果存有目的IP的地址就直接找到了),一直到找到或者TTL为0。

以太网 :是一种管理数据链路层和部分物理层的标准。

这里的目的地址和源地址指的不是IP地址而是MAC地址(硬件的地址)6个字节。最下面两个是属于ARP协议,负责让路由器/交换机中产生一个类似于hash表的路由表。

MTU:前面说到过分包问题,MTU就是管理IP数据报的载荷大小的东西。

ARP协议:是处于数据链路层和网络层的协议, 建立了主机上的IP与MAC地址的映射

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值