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的过程中慢慢补充,随时更新。

  • 相关阅读:
    mysql高级之编程优化
    高性能产品必由之路
    linux下安装xhprof
    linux下安装apc
    linux下安装vld
    python装饰器通俗易懂的解释!
    python函数基础 与文件操作
    python基础入门一(语法基础)
    iOS Keychain,SSKeychain,使用 理解 原理
    起头
  • 原文地址:https://www.cnblogs.com/myidea/p/5049622.html
Copyright © 2011-2022 走看看