网络编程预备知识

1.    网络通信
        通信/通讯需要具备两个基本的条件:
        (1)    物理媒介(物理层面)
        (2)    协议(软件层面)
            网络协议。
        
    2.    网络协议层次模型
        互联网的本质是一系列的网络协议,处于互联网上的两台计算机如果要进行通信,就需要遵守这些
        协议,就如同我们开车上路要遵守交通规则一样的。

        简单来说,协议就是计算机之间通过网络实现通信时事先达成的一种“约定”。
        这种“约定”:使那些不同厂商之间的设备,不同CPU以及不同操作系统组成的计算机之间,
        只要遵守相同的协议就可以实现通信啦。
        
        协议可以分为很多种,每一个协议都明确界定了它的行为规范,2台计算机之间必须能够
        支持相同的协议,并且遵守相同的协议进行处理,才能实现相互通讯。
        
        那么这些协议根据功能的不同分工不同我们划分为不同的层次,即每一个层次都有不同的功能
        常见的划分:

        <重点>
        如图<OSI网络七层协议.png>较为详细的交代了不同层之间是如何组合和通信的。
        发送方从最高层开始,从上到下按顺序传输数据,每一层接受到由上层处理的数据时,
        添加该层的首部并可能会对数据进行处理,而接收方则将顺序反过来,从首层开始,
        将数据的内容与该层对应的首部拆开,传输给上一层。
        
        说白了,数据在发送是是数据从应用层到物理层的一个打包的过程,接收时是数据从物理层到
        应用层的一个解包的过程。
        
        各层的大体功能和作用,如下:
        (1)    应用层
            应用层是直接面向用户的程序或服务。
            比如我们要发送数据是先由用户进程传递给应用层。
            而接收数据也是由应用层直接呈现给用户进程。
            应用层要完成用户希望在网络上完成的各种工作,因为用户可能对于发送数据有各种不同的
            要求。

            这一层可以想象成快递公司的收件员。
            工作于这一层的协议接触的比较多的主要有:FTP/HTTP等。
            
        (2)    表示层
            表示层是为异种机通信提供一种公共语言,以便能进行互操作。常见的
            协议有ASCII/SSL/TLS等。
            
            如果是linux和window的两台异种机进行通信是不能直接进行通信的,
            此时就需要表示层帮助我们去解决不同系统之间的通信语法问题。
            
            数据的加密、压缩、打包等功能也在这一层完成。
            
        (3)    会话层
            会话层的作用就是建立或断开和管理应用程序之间的通信。
            会话层可以把其看成是快递公司的调度员。
            它管理者快递的相关信息,比如快递啥时候发过去,送这一单规定需要多少的时间等等。
            它也要做同步管理,就好比我把东西运过去之后,但是那边没有人接受,那么这种情况
            就是没有同步。
            
        (4)    传输层            <重点>
            传输层起着可靠传输的作用。
            确保数据被可靠的传送到目的地址。
            此层有两个具有代表性的协议:TCP 与 UDP
            1.    TCP:Transport Control Protocol传输层控制协议
                它是一种面向连接的传输层协议,它能够提供高可靠性的通信。
                
                就是说TCP协议是在确定对方能通信的情况下才会传输数据,如果对方不能通信
                那么我们可能会一直发送请求,直至对方回应为止,一旦回应,那么通信双方
                就建立连接,开始传输数据。
                
                传输数据的过程中,有可能有数据丢失,一旦丢失,TCP就会继续重发。
                比如:
                    我现在发了10000个包出去,另外一台接收方就要告诉我接收到了这10000个包。
                    如果丢了一些包,那么接受方就需要告诉发送方丢掉了哪些包。
                    那么发送方就会将丢掉的包重新再发一遍。
                    就能够高可靠性的保证对方完整无误的接收到我发送过去的数据啦。
                    
                所以,TCP协议是数据无误、数据无丢失、数据无失序、数据无重复到达的
                通信协议,所以TCP协议一般是用于发送大量的数据。
                
            2.    UDP:User Datagram    Protocol 用户数据报协议
                它是不可靠的无连接的协议。
                在数据发送前,因为不需要进行连接,所以可以高效率的数据传输。
                    
                TCP和UDP不太一样,UDP它不会去确认目标是否能够通信,它就只管往外发送数据
                至于对方能不能够接受到数据,有没有丢包它一概不管。
                
                UDP一般用于发送少量的数据。
                
            这两种协议各有各有的好处,TCP更可靠与稳定,而UDP虽然没有那么可靠但是效率高。
            所以现在应用的更多反而是UDP。
            
        (5)    网络层
            网络层负责将数据传输到目标地址。
            这一层主要负责寻址和路由选择。主要的协议有:IP/ICMP两个协议组成。
            
            网络层负责找出一条相对更加高效的链路将数据传递过去。
            传输的地址使用的是IP地址。
            IP地址和我们的住址实际上有点相像。
            IP地址通过不断的去转发到更近的IP地址,最终可以到达目的地址。
            如何去选择这条路,就看网络层。
            
        (6)    数据链路层
            互联设备之间传送和识别数据帧。
            
            在链路层中,需要将比特流组合成字节的组合。
            
            对数据进行处理封装成数据帧和传递、错误检测的层就是数据链路层。
        
        (7)    物理层
            它的最主要的作用是通过光信号或电信号传输比特流。
            物理层所承载的就是实物。
            如:将货物运往目的地的交通工具就是物理层。
            物理层是七层模型中的物理基础,没有它就谈不上数据传输。
            比如:网线、网卡(每一个网卡在出厂的时候设定一个全世界唯一的一个MAC地址,
            一个48bits的数)。
            
    3.    常用的网络设备
        我们知道如果两台电脑通过网线直连的话是能够直接进行通信的。
        此时这两台电脑就组成一个小小的局域网,局域网内只有两台通信设备。
        但是这种使用场景非常少见,更常见的是多个设备之间互联,也就是说一个局域网内
        可以有很多个通信设备。
        但是问题是,一台计算机只有一个网口,怎么让一台计算机与另外多台计算机互联呢?
        
        此时我们就需要用到交换机(switch)。
        
        交换机:简单的来说,可以提供大量的网络端口将多台网络设备连接成一个局域网。
        交换机内部拥有一根总线,交换机所有的端口都挂接到这条总线上面,也就意味着
        多台网络设备只要通过接口连接到交换机上,那么这些网络设备从物理层面上来说,
        就是互通的。
            
        连接上同一个交换机上的网络设备如果要进行通信的话,那么可以使用广播的方式进行。
        
        路由器:
            路由器的功能是将不同的子网(局域网)之间的数据进行传递,我们把这个过程称之为寻址。
            
            通过最终地址,在路由表上进行匹配,通过算法确定下一个转发地址。
            这个地址可能是中间地址,也可能是最终到达的地址。
    
        调制调解器(猫):
            是调制器和解调器的缩写。
            是一种硬件。
            我们网络信号的传递大部分都是光信号/电信号(模拟信号),而计算机只能够识别数字信号(1/0)。
            所以计算机从网络上接收到这些信息之后,需要将其翻译成计算机能够看懂的数字信号,
            说白了,功能有点类似于AD DA转换。
            
        网关:连接两个不同子网的门户

    4.    网络数据的传输过程
        分层传输、数据封装、拆包的过程。
        
        注意:
            有人说我们既然网卡都有一个唯一的MAC地址,或者说通过MAC地址就可以找到唯一的
            一张网卡,那么通过MAC地址就应该能够可以实现任意一台主机和另外一台主机进行通信了
            那么为什么还需要IP地址?
            
            网络层负责IP地址。
            数据链路层(或者TCP/IP模型中的物理层)负责MAC地址
            以太网协议就依靠MAC地址发送数据的。
            
            理论上,单单依靠MAC地址,上海的网卡就可以找到北京的网卡。
            但是,这样做有一个很大的缺点。
            以太网协议会以广播的形式发送数据,也就是说只要处于同一局域网的设备都会收到。
            这样做,效率很低,而且广播方式只局限于发送者所在的子网络。
            如果通信双方不在同一个子网络,广播是传不过去的。
            如果传播到外网上去,互联网上的每一台计算机都会收到这个包,那么就会造成网络拥堵。
            
            因此,必须要找到一种方式,去区分哪些MAC地址属于同一个子网络,哪些不是属于同一个
            子网络。如果是处于同一个子网络,就采用广播的形式发送,否则就采用"路由"的形式发送。
            
            导致了“网络层”的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机
            是否属于同一个子网络。这套地址就叫做“网络地址”,简称“网址”。
            
            在网络层出现之后,每台计算机有了两种地址,一种是MAC地址,另一种是IP地址。
            MAC地址是由硬件(网卡)决定的,一般是不能改的。
            IP地址由软件来决定的,是可以随意更改的。
            
            所以,网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据报发送到
            该子网络中目标网卡。
            
    5.    互联网地址(IP地址)
        IP地址:(Internet Protocol Address)网络协议地址
        
        常见的IP地址有两类:
        IPv4:32bits        IPv6:128bits
        
        目前为止应用更多的是IPv4,IPv6开始在教育网中开始大量使用。
        理论上IPv4提供2^32个IP,IPv6能提供2^128个IP。
        IPv4地址有32bits,这32个bits中各个bit的含义:
            
            IPv4 32bits
                网段号:
                    用来标识某个网段
                    比如处于同一路由器下的设备处于同一网段。
                    他们是能够直接通信的,
                    在IP地址连续的高位上。
                
                
                主机号:
                    用来标识特定的网段中的特定的主机的。
                    在IP地址的连续的低位上。
                    
                如:
                    192.168.31.30(IP地址是以点分十进制的形式表示)
                    每8bits一个十进制数字,中间以 . 分隔开
                    
                    网段号和主机号相加==32bits。
                    
    IP地址的分类:
    类别            分段                       IP地址的范围                  私有地址范围
    A     0 网段号(7bits) (主机号24bits)   0.0.0.0 ~ 127.255.255.255    10.0.0.0 ~ 10.255.255.255
    B    1 0 网段号(14bits) (主机号16bits) 128.0.0.0 ~ 191.255.255.255  172.16.0.0 ~ 172.31.255.255
    C    1 1 0 网段号(21bits) (主机号8bits)192.0.0.0 ~ 223.255.255.255  192.168.0.0 ~ 192.168.255.255
    D    1 1 1 0 多播组号(28bits)          224.0.0.0 ~ 239.255.255.255  
    E    1 1 1 1 0 (留着以后用)              240.0.0.0 ~ 247.255.255.255
    
            在设置IP地址时,一般需要设置另外一个称之为子网掩码的东西。
            Netmask:子网掩码
                
            就是用来指定一个IP地址中,哪些bits是网段号,哪些bits是主机号。
            
            简单的来说,Netmask中为1是网段号,为0的是主机号。
            
            Netmask:255.255.255.0
                192.168.31.30
                
                192.168.1.4 和 192.168.3.5 不是同一个网段
                192.168.1.5 和 192.168.1.6 是处于同一个网段
                
                并不是所有的子网掩码都是合法的。
                
                255.255.114.0
                    1111 1111  1111 1111 1110 0010 0000 0000//不合法的
                    
                255.255.192.0
                    1111 1111  1111 1111 1100 0000 0000 0000//合法的
        
            我们知道一台计算机可以拥有一个独立的IP地址,一个局域网也可以拥有一个独立的IP
            地址(对外就好像只有一台计算机),对于目前广泛使用的IPv4,它的资源是非常有限的,
            一台计算机一个IP地址是不现实的,往往是一个局域网才能拥有一个IP地址。
            
            在因特网上进行通信的时候,必须要知道对方的IP地址。实际上数据包中已经附带了
            对方的IP地址,把数据包发送给路由器以后,路由器会根据IP地址找到对方的位置,
            完成一次数据的传递。
            
            那么一个局域网往往才能拥有一个独立的IP.
            IP地址仅仅只能够定位到一个局域网,无法定位到处于这个局域网内的哪台主机
            那么我们就需要用到MAC地址。
            
            其实真正能够唯一标识一台计算机的是MAC地址,MAC地址是在全世界都是唯一的。
            MAC是固定的,在出厂的时候就已经设定好了的(一般是不可被更改的)。
            局域网中的路由器/交换机会记录每台计算机的MAC地址。
            
            数据包中除了会附带对方的IP地址,也会附带对方的MAC地址,当数据包到达局域网之后
            路由器/交换机会根据数据包中的MAC地址找到对应的计算机,然后就把这个数据包
            转交给计算机,这样就完成了数据的传递吗?
        
            有了IP地址和MAC地址,虽然可以找到目标计算机,但仍然不能进行通信,
            仅有IP地址和MAC地址,计算机虽然可以正确的接收到数据,但是却不知道
            要将数据包交给那个网络程序(进程)来处理,所以通信失败。
            
            为了区分不同的网络程序,计算机会为每一个网络程序都分配一个第一无二的端口号(Port Number)
            
    6.    端口号
        TCP和UDP采用16bits的端口号来表示网络程序。
        网络应用程序从传输层的角度来看可以分为:
            TCP应用
            UDP应用
        TCP的端口号和UDP的端口号是独立的。
        所以一台上的网络应用程序由:
            MAC地址 + IP地址 + 传输层协议(TCP/UDP) + 端口号 来确定。
            
        端口号并不是说你想指定就指定的,由IANA来管理的。
            比如:
                ftp服务-->21端口
                http服务-->80端口
                ....
        端口号其实说白了就是一个0~65535的一个数字。 
    
    7.    网络字节序的问题
        UDP/TCP/IP协议规定:
        把接收到的第一个字节当做高位字节看待,这就要求发送端发送的第一个字节是高位字节。
        
        网络字节序是大端字节序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值