草庐IT

简单记录 图解TCP/IP

5rem 2023-03-28 原文

0x00 电子书

「图解TCPIP(第5版).pdf」https://www.aliyundrive.com/s/gF9tDM43deS
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

0x01 OSI参考模型

  1. 物理层 比特流和电子信号直接的切换
  2. 数据链路层 数据帧和比特流之间的转换(数据帧的生成与接受)
  3. 网络层 负责寻址和路由选择
  4. 传输层 可靠的传输,只在双方通信节点进行处理,不在路由上进行处理
  5. 会话层 负责建立和断开通信连接(数据流动的逻辑通路)
  6. 表示层 负责数据格式的转换,将设备固有的数据格式转换为网络标准格式
  7. 应用层 针对特定应用的协议
  • 在每个分层上,在处理上一层传输过来的数据时可以附加上当前分层的协议所必需的“首部”信息,接收端对收到的数据进行“首部”和“内容”的分离,在发送到上一层,最终将数据恢复成原样
  • mac地址和ip地址都具有唯一性,只有ip地址具有层次性
  • mac寻址中参考的表叫做,地址转发表,表中记录mac地址
  • ip寻址中参考的表叫做路由控制表,表中记录的是集中之后的网络号

0x02 TCP/IP模型

  1. 物理层 负责数据传输的硬件
  2. 网络层 使用ip协议,ip协议基于ip地址进行转发分包数据
    • ip 使用ip地址作主机的标识,不具备重发机制
    • ICMP 如果ip数据包发送途中发生异常导致无法到达对端目标时,icmp会给发送端发送一个异常通知
    • ARP 从分组数据包的ip地址中解析出mac地址
  3. 传输层 使应用程序直接能够正常通信
    • TCP 面向有连接到传输协议
    • UDP 面向无连接的传输层协议
  4. 应用层 将OSI中会话层,表示层,应用层的功能集中到应用程序中实现
    -WWW 客户端和服务端之间的通信的协议是http协议,所传输的数据格式是HTML,http属于应用层协议,HTML属于表示层协议

0x03 数据链路

  1. 数据链路层的协议定义了,通过通信媒介互联设备之间传输的规范

0x04 IP协议(网络层)

  1. 主要作用-实现点对点通信
  2. ip地址用于-连接到网络中的所有主机识别出进行通信的 目标地址
  3. ip实现的是多个数据链路只见那通信的协议
  4. 最大传输单元(MTU)
    • 以太网 1500字节
    • FDDI 4352字节
    • ATM 9180字节
      经过分片之后的ip数据包在被重组的时候,只由目标主机进行
  5. 路径MTU发现
    从发送端主机到接收端主机之间不需要分片时最大的MTU,避免中途路由器进行分片处理

0x05 ip相关技术

  1. DNS 域名查询系统
    hosts文件

    • 跟域名服务器中注册着以下第一层域名域名服务器ip地址
    • 想域名服务器进行查询,接受查询的域名服务器首先会在自己的数据库进行查找,如果有该域名对应的ip地址就返回,如果没有,域名服务器会再向上一层的域名服务器进行查询
  2. ARP IP查mac
    只适用于ipv4,ipv6可以用icmp

    • ARP请求包中带有想要查询主机的ip地址和自己的mac地址,目标主机接收到SRP请求包后,如果请求包中的ip地址和自己的一致,就将自己的mac地址放入ARP相应包中返回给发送端
    • ARP可以动态的将进行地址解析
  3. RARP 从mac查询ip

  4. 代理ARP,ARP会被路由器隔离,采用代理ARP的路由器会将请求转发到邻近网段

  5. ICMP
    确认ip包是否成功送达目标地址,通知在发送过程中的ip包被废弃的原因,ICMP的通知消息会使用ip进行发送

    • 类型3 CMP目标不可达消息,ip路由器无法将ip数据包发送给目的地址时,会给发送端主机发送一个不可达的ICMP消息,并显示具体原因
    • 类型5 重定向消息,如果路由器发现发送端主机使用不是最佳的路径发送数据,会给发送端返回一个ICMP重定向消息,消息中包含了最适合的路由信息
    • 类型11 超时消息,ip包中有TTL(最大生存周期),它的值每经过一个路由就-1,直到0该包就会被丢弃。此时ip路由器就会发送一个ICMP超时的消息给发送端
    • 类型0,8 回送消息,判断所发送的数据包是否已经成功到达对端,可以向对端主机发送回送请求的消息(8),也可以接受对端主机发送过来的会送应当消息(0),ping命令就是利用这个消息实现的
    • 类型4 原点抑制消息,为了缓解低速广域网下路由器的拥堵
    • 类型9,10 路由探索消息,主要用于发现与自己相连网络中的路由器
    • 类型17,18 地址掩码消息,用于主机或路由器想要了解子网掩码情况
  6. ICMPv6
    没有icmpv6,ipv6就无法正常通行,ipv6中从IP定位mac,从ARP转移到ICMP的邻居探索消息

    • ICMPv6中类型133-137的消息叫做邻居探索消息
  7. DHCP
    没有ip地址可以发送DHCP包

  8. NAT
    用于在本地网络中使用私有网络,连接互联网时转而使用全局ip地址的技术

    • NAT-PT 将ipv6的首部转换成ipv4首部的技术
  9. ip隧道
    经过隧道的数据统合为一个数据,在前加上网络首部,网络首部后面继续追加网络首部的技术,解决ipv4,ipv6通信问题

0x06 TCP,UDP

通信中常采用5个信息识别一个通信,源IP,目标ip,协议号,端口号,目标端口号

  1. 端口号 识别统一主机中进行通信的不同程序
  • 0-1023,熟知端口号,用于广为使用的应用程序的端口号
  • 1024-49151,登记端口号,没有熟知的应用程序使用,需要等级,以免重复
  • 49152-65535,动态分配端口号
  1. 端口号和协议 不同协议可以使用相同的端口号,数据到底ip层,先检查ip首部中的协议,在传给对应的模块,0-1023与传输层协议没有关系,只要端口一致都分配到统一种应用程序进行处理。

TCP

面向有连接的,可靠的流协议,提供"顺序控制",“重发控制”,“流控制”,”拥塞控制“等提高网络利用率的功能

  • 通过序列号的应答实现可靠传输

  • 重发超时 在每次发包时都会计算往返时间以及偏差,将往返时间和偏差相加再大一点,就是重发超时的时间

  • ACK,确认应答,发送端数据到达接收端时,接收端会返回一个已收到消息的通知。

  • SYN,两台计算机在TCP连接会话时,连接首先会被初始化,完成这个任务的就是 SYN。SYN包,表明另一台计算机已经做好会话准备,发出服务请求的计算机才发送SYN包

  • FIN,断开连接。FIN为1时,表示今后不会再有数据发送,希望断开连接

  • 三次握手四次挥手

  • tcp以段为单位发送数据
    • 在tcp建立连接的同时,也可以确定发送数据包的单位,可以称为最大消息长度MSS,最理想的长度真好是ip中不会被分片处理的最大数据长度。
    • TCP在传送大量数据时,是以MSS的大小将数据进行分割发送
    • MSS在三次握手时,会在两端主机之间计算产生
  • TCP流控制,TCP首部中有一个字段用来通知窗口大小,接受端将自己可以接受的缓冲区大小发送给发送端,这个字段值越大,网络的吞吐量越高。接受的缓冲区一旦面临数据溢出时,窗口大小值也会被设置成更小的值通知给发送端,从而控制数据流量

UDP

具有不可靠性的数据报协议

其他传输层协议

  1. UDP-LITE,轻量级用户数据报协议
  2. SCTP,流控制传输协议
  3. DCCP,数据报拥塞控制协议

# 0x07 路由协议

# 0x08 应用协议

  1. telnet,23
  2. ssh
  3. FTP
  4. SMTP,电子邮件
  5. http,

有关简单记录 图解TCP/IP的更多相关文章

  1. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  2. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  3. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  4. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  7. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  8. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  9. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

  10. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

随机推荐