zoukankan      html  css  js  c++  java
  • TCP/IP详解学习笔记

    【TCP/IP详解学习笔记(1)基本概念】

    为什么会有TCP/IP协议?

    计算机型号多种多样,并且运行于不同操作系统。虽然电线把计算机连接到了一起,但是这些计算机无法“交流”,所以需要定义一些东西来让这些计算机交流,TCP/IP因此而生。
    

    TCP/IP协议分层

    提到分层,我们很容易想到OSI的七层参考模型。TCP/IP协议族的层次有些不同。
    

    应用层:

    - Telnet远程登录
    - FTP文件传输协议
    - SMTP简单邮件传送协议
    - SNMP简单网络管理协议
    

    基本知识点

    • 路由器与网桥

        路由器的好处是为不同类型的物理网络提供连接:以太网、令牌环网、点对点的链接和FDDI(光纤分布式数据接口)。路由器是在网络层上对网络进行互联,网桥是在链路层上对网络进行互联
      
    • 互联网地址

        网络上的每个接口都必须有一个唯一的Internet地址(也称作IP地址),IP地址是网络号+主机号
      
    • 域名系统

        DNS是一个分布式数据库,提供IP地址和主机名之间的映射信息
      
    • 端口号

        这个号码是用在TCP,UDP上的一个逻辑号码,并不是一个硬件端口,我们平时说把某某端口封掉了,也只是在IP层次把带有这个号码的IP包给过滤掉了而已。
      
    • RFC

        RFC是tcp/ip协议的标准文档
      
    • 应用编程接口

        现在常用的编程接口有socket和TLI。而前面的有时候也叫做“Berkeley socket”,可见Berkeley对于网络的发展有多大的贡献。
      
    • 以太网

        以太网不是一种具体网络,是一种技术规范。以太网是当今现有局域网采用的最通用的通信协议标准,该标准定义了在局域网中采用的电缆类型和信号处理方法。以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术,并以10M/S的速率运行在多种类型的电缆上。
      
    • TCP/IP中,网络层和运输层之间的区别是最为关键的:网络层(IP)提供点到点的服务,而运输层(TCP和UDP)提供端到端的服务

    • 计算机互联构成计算机网络

    • 计算机网络互连构成因特网

    【TCP/IP详解学习笔记(2)链路层】

    数据链路层三个目的:

    • 为IP模块发送和接收IP数据报
    • 为ARP模块发送ARP请求和接收ARP应答
    • 为RARP发送RARP请求和接收RARP应答

    以太网(Ether-net)是指数字设备公司( Digital Equipment Corp.)、英特尔公司(Intel Corp.)和Xerox公司在1982年联合公布的一个标准,这个标准里面使用了一种称作CSMA/CD的接入方法。而IEEE802提供的标准集802.3(还有一部分定义到了802.2中)也提供了一个CSMA/CD的标准。这两个标准稍有不同,TCP/IP协议对这种情况的处理方式如下:

    • 以太网的IP数据报封装在RFC894中定义,而IEEE802网络的IP数据报封装在RFC1042中定义。

    • 一台主机一定要能发送和接收RFC894定义的数据报。

    • 一台主机可以接收RFC894和RFC1042的封装格式的混合数据报。

    • 一台主机也许能够发送RFC1042数据报。。如果主机能同时发送两种类型的分组数 据,那么发送的分组必须是可以设置的,而且默认条件下必须是RFC 894分组。

    可见,RFC1042在TCP/IP里面处于一个配角的地位。

    • SLIP

    是一种在串行线路上对IP数据报进行封装的简单形式,SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和告诉调制解调器介入Internet

    • PPP

    PPP(Point-to-Point Protocol)协议是在SLIP的基础上发展起来的,它是TCP/IP网络协议的一员,PPP是TCP/IP的扩展,它增加了两个额外的功能组:

    (1)它可以通过串行接口传输TCP/IP包
    (2)它可以安全登录
    
    • 环回接口

    loopback接口,在网络设备上是一种特殊的接口,它不是物理接口,而是一种看不见摸不着的逻辑接口(虚拟接口)

    详细见这

    • 最大传输单元MTU

    各类型的网络对数据帧的长度都有一个限制,链路层的这个特性称作MTU,即最大传输单元

    • 路径MTU

    两台通信主机中最小的MTU,被称作路径MTU

    【TCP/IP详解学习笔记(3)IP协议,ARP协议、RARP协议】

    这三个协议处于同一层

    IP协议

    IP : 不可靠 无连接

    • 不可靠:不能保证IP数据报能成功到达目的地(错误处理方式:丢弃数据报,然后发送ICMP消息给信源端)
    • 无连接:IP并不维护任何关于后续数据报的状态信息

    看下图:

    4位版本:IPV4
    
    首部长度:单位是32位字,即4字节,首部长度占4位,可表示最大十进制是15,首部长度达到最大值60字节
    
    TOS:3bit优先权子字段(已被忽略)+4bitTOS子字段+1bit未用位(必须置0)
    4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用
    
    总长度字段:整个IP数据报的长度,以字节位单位,该字段长16bit,所以IP数据报最长可达65535
    
    TTL:time-to-live,某个数据报每穿过一个路由器,它的值就减1,当数据报的TTL称为零,它就被自动抛弃(说明了IP协议包的不可靠性)
    
    选项:
    	(1)安全和处理限制
    	(2)记录路径(让每个路由器都记下它的IP地址)
    	(3)时间戳
    	(4)宽松的源站选路
    	(5)严格的源站选路
    

    IP路由选择

    主要完成以下功能:
    
    (1)搜索路由表,先寻找与目的IP匹配的表目,若找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(根据路由表标志字段的值)
    (2)搜索路由表,寻找与目的网络号匹配的条目,若找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(根据路由表标志字段的值)
    (3)搜索路由表,寻找“默认”条目,若找到,把报文发送给该表目指定的下一站路由
    
    如果都失败了,丢弃
    

    ip路由选择通过逐跳来实现。数据报在各站传输过程中目的IP地址始终不变,但是封装和目的链路层地址在每一站都可以改变

    子网寻址

    IP地址定义是网络号+主机号。但是现在所有主机都要求子网编址,即把主机号再细分为子网号+主机号,最终一个IP地址就是网络号+子网号+主机号

    子网掩码

    用于让主机知道有多少比特给了子网号,有多少比特给了主机号。值为1的比特留给网络号和子网号,为0的比特留给主机号。

    两个重要的命令

    获取接口和网络的信息

    ifconfig

    netstat

    ARP协议

    将IP地址转换成物理地址

    假设A与B通信:

    主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
    主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;

    第1步:根据A上的路由表内容,IP确定访问B的转发IP地址是192.168.1.2。然后A在自己的本地**ARP缓存**中检查B的匹配MAC地址。
    
    第2步:如果A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
    
    第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
    
    第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
    
    第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。
    

    【TCP/IP详解学习笔记(4)ICMP报文,ping程序、traceroute程序】

    ICMP

    IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。

    ICMP封装在IP数据报内部,当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。书上的图6-3清楚的给出了错误类型和代码的组合代表的意思。

    尽管在大多数情况下,错误的包传送应该给出ICMP报文,但是在特殊情况下,是不产生ICMP错误报文的。如下:

    1. ICMP差错报文不会产生ICMP差错报文(除IMCP查询报文)(防止IMCP的无限产生和传送)
    
    2. 目的地址是广播地址或多播地址的IP数据报。
    
    3. 作为链路层广播的数据报。
    
    4. 不是IP分片的第一片。
    
    5. 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。
    

    虽然里面的一些规定现在还不是很明白,但是所有的这一切规定,都是为了防止产生ICMP报文的无限传播而定义的。

    ICMP的应用ping

    大多数TCP/IP实现都在内核中直接支持ping服务器——这种服务器不是一个用户进程

    ping还给我们一个看主机到目的主机的路由的机会。这是因为,ICMP的ping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数据报中。而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机。但是无论如何,ip头所能纪录的路由列表是非常的有限。如果要观察路由, 我们还是需要使用更好的工具,就是要讲到的Traceroute(windows下面的名字叫做tracert)。

    ICMP的应用Traceroute

    Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。

    Traceroute原理:

    它收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。

    这过程中涉及到一个问题,即:如何判断UDP有没有到达目的主机呢?
    
    traceroute使用了一个技巧。TCP和UDP协议有一个端口号定义,普通网络程序只监控少数几个号码较小的端口,如80,23等。。但是traceroute发送的是端口号>3000的UDP数据报,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。
    

    【TCP/IP详解学习笔记(5)IP选路,动态选路】

    查看路由表的方法:

    (1)route

    (2)netstat -r

    IP选路规则:

    每当主机要发送IP数据包,都要先搜索路由表,以确定往哪个接口发送数据,并确定下一站路由器,具体的搜索过程如下

    (1)搜索匹配的主机地址;
    (2)搜索匹配的网络地址;
    (3)搜索默认路由。
    

    如果通过以上三个步骤之后都没有匹配的路由项(没有默认路由),则产生主机不可达或者网络不可达ICMP差错报文。

    进一步认识路由表:

    root@hyx-virtual-machine:/# netstat -r
    内核 IP 路由表
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    default         localhost       0.0.0.0         UG        0 0          0 eth0
    172.16.69.0     *               255.255.255.0   U         0 0          0 eth0
    root@hyx-virtual-machine:/# 
    

    对路由表的说明

    (1)Destination:目的IP地址或网络地址;
    (2)Gateway:即下一站路由器,*表示无须经过下一站路由器就可以直接到达目的地址或目的网络;
    (3)Genmask:子网掩码;
    (4)Flags:标志字段,这里可能出现U,G,H,D,M,R等,U表示可用;G表示Gateway字段是个路由器,否则表示是个直接出口;H表示Destination是个主机IP地址,没有H表示Destination是网络地址;D表示该路由项由ICMP重定向报文创建;M表示该路由项由ICMP报文修改而来;R表示由动态选路协议恢复的路由项。
    多数系统内核对路由表的实现都包含上述内容,其它字段视系统而定。
    

    导致路由表发生改变的方法或原因:

    (1)可以通过route add或者route del来增加或者删除路由项;
    (2)ICMP重定向报文导致接收主机修改或者增加路由项;
    (3)ICMP路由通告报文也往往会导致路由表发生变化;
    (4)动态选路协议(RIP,OSPF等)导致路由表不断更新。

    【TCP/IP详解学习笔记(6)IP分片】

    可以用netstat -i来查看自己网络的MTU,如下:eth0的MTU是1500,本地环回接口的MTU是65536

    root@hyx-virtual-machine:/# netstat -i
    Kernel Interface table
    Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
    eth0       1500 0    187262      0      0 0           355      0      0      0 BMRU
    lo        65536 0       576      0      0 0           576      0      0      0 LRU
    root@hyx-virtual-machine:/# 
    

    但是这只是本主机所在局域网的MTU,当一个IP数据包企图跨网络进行传输时,情况要稍微复杂些,因为不同的网络可以有不同的MTU,IP数据包在传输过程中,只要有必要就会进行分片,这就是说,分片之后的IP数据包有可能再进行分片。一个IP包传输过程中所经过网络的最小MTU成为路径MTU。

    【TCP/IP详解学习笔记(7)单播、广播、多播与IGMP】

    单播:只有一个目的地址的封包帧,这是我们在 TCP/IP 网络中最常见的一种通信方式,当你用浏览器连接一个Web服务器的时候,建立的就是单播,当你用QQ和其他人聊天的时候,传输的也是单播。

    广播地址分类:

    (1)受限的广播地址,即255.255.255.255,目的地为255.255.255.255的数据包只能出现在本地网络中,路由器在任何情况下都不对这类数据包进行转发。 
    (2)指向网络的广播地址,即主机号为全1的IP地址。
    (3)指向子网的广播地址为主机号为全1且有特定子网号的地址。 
    (4)指向所有子网的广播地址的子网号及主机号为全1。
    
    广播IP地址一般对应的广播物理地址为ff:ff:ff:ff:ff:ff。
    

    多播:可以说广播是多播的特例,多播就是给一组特定的主机(多播组)发送数据,这样,数据的播发范围会小一些(实际上播发的范围一点也没有变小),多播的MAC地址是最高字节的低位为一,例如01-00-00-00-00-00。多播组的地址是D类IP,规定是224.0.0.0-239.255.255.255。

    IGMP:IGMP(Internet Group Management Protocol)作为因特网组管理协议,是TCP/IP 协议族中负责IP 组播成员管理的协议,它用来在IP 主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。IP主机通过发送IGMP 报文宣布加入某组播组;本地组播路由器通过周期性的发送IGMP 报文轮询本地网络上的主机,确定本地组播组成员信息。

    【TCP/IP详解学习笔记(8)各层数据包格式及数据包分析】

    以太网

    IP

    TCP

    UDP

    数据包分析

    【参考资料】

    参考1

    参考2

    《TCP/IP详解卷1》

    【体会】

    阅读《TCP/IP详解卷1》过程中,真的是有好多读不懂的地方,只是知道讲的非常细。。。可能是自己基础太LOW了。。后来在网上找了两篇博文阅读,都是针对这本书的读书心得,阅读之后,最大收获是进一步理解了数据包的封装方式和格式,并且能够完全自己看懂wireshark捕获到的数据流,并能简单分析,有很多没有看到的知识,打算在以后研究wireshark的过程中慢慢补充,随时更新。

  • 相关阅读:
    随机森林算法参数调优
    BAYES和朴素BAYES
    阿里云 金融接口 token PHP
    PHP mysql 按时间分组 表格table 跨度 rowspan
    MySql按周,按月,按日分组统计数据
    PHP 获取今日、昨日、本周、上周、本月的等等常用的起始时间戳和结束时间戳的时间处理类
    thinkphp5 tp5 会话控制 session 登录 退出 检查检验登录 判断是否应该跳转到上次url
    微信 模板消息
    php 腾讯 地图 api 计算 坐标 两点 距离 微信 网页 WebService API
    php添加http头禁止浏览器缓存
  • 原文地址:https://www.cnblogs.com/myidea/p/5049622.html
Copyright © 2011-2022 走看看