zoukankan      html  css  js  c++  java
  • Visual C++ 网络编程 笔记

    第一章 网络分层模型
    OSI模型
    应用层:服务于应用程序的协议,比如用于域名解析的DNS协议,用于下载界面内容的HTTP协议
    表示层:处理不同硬件和操作系统之间的差异,确保应用层之间顺利通信 and 加密 and 压缩
    会话层:两个应用程序之间建立逻辑连接,为创建管理和宗旨对话提供必要的方法,一般以API形式出现,SOCKET API
    传输层:提供数据传输的服务,端对端或者主机对主机,TCP(面向连接) 和 UDP 协议
    网络层:如何把数据从一个设备发射到另外一个设备,地址、路由、分段、重组,IP协议
    数据链路层:如何将设备和本地的网路连接 LAN WiFi
    物理层:硬件规范,编码和信号
    第二章 网络设备
    广播域:在一个网络中能够相互接收广播数据的一组设备
    冲突域:在某个网络环境中发生冲突的一组设备,就是在某一时刻只能有其中一个设备发送数据

    集线器:工作在物理层,项链的设备处于同一个冲突域。
    交换机:将设备分离在不同的冲突域,工作在链路层,交换机可以检查出经过的数据帧包含的源和目标MAC地址,同时发送多的时候应用缓冲区。
    桥:用于连接网段

    路由器:网络层设备,为了实现IP协议总的地址,路由,分段,重组功能,划分广播域和冲突域
    1.IPv4地址
    形式为a.b.c.d 划分为两个部分,网络ID和主机ID
    CIDR 划分方法:在一个IPv4地址后加一个/24表示用前面的24位作为网络ID,剩下的作为主机ID
    192.168.1.123/24 IP为192.168.1网络中的IP为123的主机地址
    2.默认网关
    同一个网络中的设备均可以直接通信,默认网关是一个网络的默认出口点,发往其他网络的数据通过它发送出去。

    第三章 IP
    3.1 IP概述
    IP协议是网络层协议,地址,路由,分段,重组。-> IPV4的几个关键字段
    IP主要关心的是如何把数据从一个设备发射到另外一个设备。任何一个设备都是通过网络接口卡(NIC)计入网络,如果一台设备想要被其他设备访问到,那么其网卡必须有唯一的地址。
    如何标识主机ID 和 网络ID?

    分类法:分为A-E五类
    网络ID A 0-127 B 128-191 C 192-223 D 224-239 E 240-255
    特殊地址:主机ID的二进制位全部为0 -》 网络地址
    主机ID 二进制位全部为1 —》 广播地址
    网络ID二进制位 全部为0 -》 当前网络
    通配地址 0.0.0.0 通配地址用来表示本机的任意一个IP地址
    127.开头的地址为环回地址 也就是自己发送给自己

    私有地址:IPv4地址优先,如果保证使用IP和公网中的IP不发生重合,可以使用私有地址,这些地址不会被公网认可
    分类法的优点:简单明了,本身包含类别信息。
    分类法的缺点:灵活性不足。

    子网化
    为了解决分类法不能很好适应一个网络中可能存在多个子网络的问题,人们引入的子网化的概念。
    在原有分类方法的基础上进行划分,变成三级结构,网络ID 子网ID 和主机ID (网络ID是保持不变的)
    可以用任意位作为子网ID,只要不超过主机ID的使用位数就可以。需要用子网掩码来表明子网ID 的位数 AND 一下!
    并不需要让所有划分出来的子网都具有相同位数的子网ID,可以根据需要变化
    外部网络并不知道子网的存在,只需要知道网络ID即可,网络的网关路由器在接受到数据之后把数据转发到哪个子网。

    CIDR(父网化)
    并不存在子网ID的概念,IANA把地址分为几大块,然后进一步划分一直到终端机构组织。

    3.3 IP路由
    有了地址之后,如何把IP数据包传递到目标地址(路由)。在发送数据之前,检查目标地址是否和自己处于同一个网络,如果是就通过ARP来获取目标设备的MAC地址(地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议),如果不在同一个网络,把数据发送给处于同一个网络的网关路由器,然后继续发送一直到可获得接受方的MAC地址。路由器之间的跳转由路由表来决定。
    路由表包含内容:
    网络目标:某一主机,网络,默认路由。网络掩码为255.255.255.255表示某一主机的IP地址 ,当网络掩码和目标都是0.0.0.0,表示默认路由。否则表示网络地址。
    网络掩码:用于确定网络目标所列出的IP地址的网络IP部分。
    网关: 数据包应该被发到的下一个路由器的IP地址。
    接口:下一个路由器接受的接口。
    度量:信息发送成本。
    设备发送数据的时候首先寻找匹配的主机地址,如果没有就寻找匹配目标网络地址,如果都没找到就查找默认路由,然后把数据宝发送给网关指示的下一个路由器。

    3.4 分段和重组
    IP在把数据交给数据链路层传输的时候,要求数据部分的大小不能超过MTU。不同类型链路层MTU不同,所以在传输过程中需要一定的分段。
    一个IP数据报分为两部分 :IP 包头 和 数据部分。
    IP必须为每一个新的分段添加一个IP包头,IP尽量以MTU作为分段大小,但是每一分段中数据报的字数必须为8的倍数。IP包头中有一位来表示数据的偏移。
    重组只会发生在目标设备上。当目标设备接受完一个IP数据报所有分段之后,将这些IP数据报重组成为原来的IP数据报。IP包头标志属于哪个数据报,在接受到带有结束标志的数据报后确认已经接受所有分段,如果超过一定时间没有收到结束标志,南无接受失败!


    3.5 IP 包头
    包含信息:
    版本,包头长度,(数据部分在整个IP段中的偏移)
    服务类型:
    总长度:IP数据报大小(整个!)
    分段标志: 重组过程中确定分段所处的IP数据报
    标志:
    分段偏移:一个分段的数据部分再起原始IP数据报中数据部分的偏移。
    生命周期:防止IP数据进入无限循环
    ....

    第四章 UDP (传输层协议)
    如果发送方上面有多个进程需要同时把数据发送到目标设备那么目标设备收到数据后,如何确定数据由哪个进程接受呢?(传输层)提供了进程地址(多路复用技术),UDP提供进程寻址的功能,把来自应用程序的数据打包直接发送,并不保证可靠性(为了速度!)。
    UDP是一种简单的基于消息的不可靠的传输层协议,提供了多路复用和多路分解。
    UDP包头内容:源端口号,目标端口号,数据长度,校验和。
    4.3端口
    多路复用:多条车道变为一条车道,发送发不会针对每一个进程建立一个缓冲区而是建立一个公共缓冲区。
    多路分解:收到的数据分配给进程。
    TCP 和 UDP 都是使用16位unsigned 整数来实现多路复用和多路分解,端口号也被称为进程地址。
    IP接受到数据报的时候会检查IP包头中的协议字段,当发现是TCP就把数据交给TCP,....

    UDP是一种相对简单的传输层协议,UDP基本就是对进程写入的数据进行简单的打包然后把UDP数据报交给IP,
    UDP的打包目的:
    1. 加入源和目标端口号 提供进程寻址的功能
    2. 加入一个校验和,对简单对的传输错误进行检测。
    对于需要广播或者组播的程序只能使用UDP

    第五章 TCP
    和UDP一样,TCP也是传输层上的一种协议,可以把TCP看成应用程序和网络层之间的一个借口,通过TCP可以提供可靠的数据传输。TCP除了提供进程寻址和数据校验以外,还提供了 连接管理,字节流数据传输 以及可靠数据传输功能。
    因此TCP也被称为面向连接的,面向流的,可靠的传输协议。
    进程寻址:同样使用16位无符号整数端口号。
    数据校验:TCP也提供了对包头和数据部分的校验功能,并且在计算校验和的时候需要一个伪头部
    面向连接:指的是使用TCP通信的双方在交换数据之前必须先建立一个TCP连接,在完成通信之后还要关闭。建立之后数据传输是双向的。
    字节流:TCP并不保持应用程序每次写入的数据边界。像管道一样传输。
    可靠数据传输:TCP虽然提供面向字节流的服务,但是IP发送时分段的的,所以TCP必须划分字节流然后交给IP发送,这些数据单元就是TCP分段,然而IP在传输中是不可靠的,TCP为了提供可靠的是数据传输,要求目标设备在接受到一个TCP分段之后必须给发送方回发一个确认信息,如果过了一段时间之后没有收到确认信息,就会重现新发送分段。如果发生重复或者乱序就进行相应调整。
    TCP工作包括:确认,超时,重传,重排,过滤
    TCP分段听不对段进行编号,而是对每一个字节进行编号,一个TCP分段式通过该段的第一个字节的编号和该字节的长度标识的。
    TCP 流量控制
    根据接收方的情况来调整发送方发送数据的速率。。
    拥塞,TCP虽然不能解决拥塞,但是至少可以通过相应的处理不让拥塞加重。

    TCP包头内容:
    1.源端口 目标端口
    2.序列号 TCP分段所包含数据部分的第一个字节编号
    3.确认号 确认TCP分段(ACK)中保存的希望发送方下次发送的TCP分段的序列号
    4.数据偏移 包头的大小
    5.预留字段 必须全部为0
    6.控制位 SYN 连接请求 ACK 接受确认 RST 连接重置
    7.窗口大小 - 与可靠数据传输有关
    8.校验和 与UDP算法类似
    10.选项(可变长度)
    (1) 最大分段长度
    (2) 允许选择性确认 打破TCP累计确认导致的过多重新发送

    TCP 连接管理(面向连接的协议)

    建立连接阶段:
    三路握手:客户端发送SYN,目标端口是服务器监听中的端口,服务器接收到之后,发送一个ACK分段和一个服务器的SYN分段,客户端再次给服务器发送一个ACK分段。
    ACK分段中确认号字段的值 = 被确认分段的序列号 + 被确认分段的数据长度 + 1
    在三路握手的同事实现了序列号的同步,确认了发送数据的序列号开始范围。


    数据传输阶段:
    当TCP传输中多的一方崩溃了,另一方不会知道,还有可能继续发送数据,此时崩溃的TCP如何处理这些异常数据?
    重置连接。
    实时监测方法:TCP心跳监测,定时发送一个不含数据的分段等待ACK。

    关闭连接:
    1.甲方想要关闭连接的时候发送一个FIN分段,发送之后不能再发送人和带有数据的分段。
    2.乙方收到后发送一个ACK分段,等待应用程序把数据发送完之后发送一个FIN。
    3.甲方收到之后返回一个ACK。

    TCP 可靠数据传输
    5.5.1 TCP可靠数据传输的基本原理
    TCP将数据交给IP传输,然而IP并不保证数据传输的可靠性,采取ACK分段验证的方法检测数据传输的可靠性,可以归纳为确认,超时(对于每个TCP分段再发送的时候会设置一个定时器,如果一段时间没有返回,就判断丢包了),重传。
    5.5.2 确认
    发送方在发送了一个TCP分段之后,将会等待接收方对该分段的确认(TCP分段,而且ACK标识位必须为1)。TCP如何确定哪一个确认对应哪一个分段?每次发送一个分段然后等待分段返回会很慢,我们用确认号标识前一段数据已经接受成功。累计确认特性,无需发送前n个ACK,只需在第n个分段后发送一个ACK表示发送成功。
    重发机制:
    TCP需要对多个分段进行跟踪,建立一个重发队列,每当需要发送一个新的TCP分段的时候,将把它的一份拷贝放入该队列,同时为它启动一个计时器,超时之后从队列重发一次,如果在那之前得到确认就从队列里面移除掉。
    不能对接收到的非连续分段进行确认:选择性确认选项SACK,通过SACK选项可以告知发送方是否已经收到了这些非连续分段,减少重发。
    SACK选项的格式 第一字段为选项类型 第二字段为选项长度 然后是若干个连续分段的左右边界

    5.6 TCP流量控制 和 拥塞控制
    TCP采用华东窗口确认系统来进行流量控制,发送方有一个窗口,接收方有一个接收窗口(决定窗口大小),表示最多能够接收到的数据量,边发送边享有滑动,左边的得到确认之后就可以向右 移动 。如果发生分段丢失会停在接收不到ACK的数据那里。

    基于滑动窗口确认系统的流量控制
    接收方的接收缓冲区在一个连接会话中是不变的,接收区除了对接收的数据进行确认还要对数据进行处理,TCP就是通过改变窗口的大小来实现流量控制,接收窗口大小等于缓冲区可用空间的大小。

    滑动窗口存在的问题:窗口收缩 和 愚蠢窗口综合症

    窗口收缩:接收方违背了之前的承诺导致数据丢失,所以我们减少缓存区空间之前必须先接受完之前承诺的数据。
    愚蠢窗口综合症:就是每次窗口不要开太小,避免频繁开关窗口降低带宽利用率。

    TCP是一个很复杂的传输层协议,包括进程寻址,连接管理,可靠数据传输,流量控制和拥塞控制。
    进程寻址采用端口号来实现,数据校验则使用UDP和IP类似的算法来实现,连接管理又分为建立连接和关闭连接,可靠数据传输归纳为确认,超时,重发。于滑动窗口协议,

  • 相关阅读:
    【文本处理命令】之find搜索命令
    【文本处理命令】之grep搜索命令详解
    【VM配置】配置主机名称、网卡和yum源配置
    【Linux命令】安装命令(yum,rpm)
    【Linux命令】文件目录管理命令7个(touch、mkdir、cp、mv、rm、dd、file)
    【Linux命令】文本文件编辑命令10个(cat、more、less、head、tail、tr、wc、stat、cut、diff)
    Redis系列---redis简介01
    redis中 Could not get a resource from the pool 异常解决
    Nginx配置Tomcat8反向代理出现 java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
    FtpClient上传文件速度非常慢,而且大小为0,上传失败
  • 原文地址:https://www.cnblogs.com/joeylee97/p/7638873.html
Copyright © 2011-2022 走看看