zoukankan      html  css  js  c++  java
  • 计网复习

    http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

    现在广泛应用的,是TCP/IP体系中的五层结构。对应的就是OSI体系的七层结构。

    那么,五层结构,也就是分为:

    物理层 -- 数据链路层 -- 网络层 -- 传输层 -- 应用层

    怎么记呢?从理解上记

    比如我现在需要从  广州 -- 洛杉矶  怎么做

    1、物理层  (网线)

    计算机要通信,肯定要连接在一起,现在计算机的通信都是通过光缆来连接的,和外国的,也是通过海底光缆来连接的。所以物理层要解决的就是,链接,然后0101010101010101010发送信息

    2、数据链路层 (把1010100101分组 && 拥有了MAC,局域网广播通信)

    但是这样不能识别,肯定要按照规定的分组来识别,比如8个一组等等。同时,多台计算机连接在一起形成一个子网,确实可以通讯了,但是我发给你,也需要有你的地址。所以,数据链路层就解决了这个问题。把数据变成   MAC地址 + 数据的格式,然后通过广播的方式,广播就是在你的局域网中发出去,每个人都可以看到,但是如果比较和自己的MAC不对应,就不接收。

    3、网络层 (IP协议,广域网通信, 引进路由)

    现在是可以通讯了,但是按照上面的方式,每次发送数据都用广播的方式,是不行的。世界上太多机器了,不能这样。不同网段的,就不能用广播的方式来传递了。不然会窘机

    因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。

    遗憾的是,MAC地址本身无法做到这一点。它只与厂商有关,与所处网络无关。

    这就导致了"网络层"的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。

    所以,有了IP协议,在广域网通讯的时候,如果同一局域网的可以用MAC地址这样广播方式搜查,如果不同局域网的,就不知道对方的MAC地址。那么就发送给自己的网关,网关会识别然后发送去其他网段的了。

    所以:分两类情况

    3.1  如果同一局域网,那么发送   对方MAC  对方IP

    3.2 如果不同局域网,那么发送   网关MAC  对方IP

    4、传输层 (各种应用监听的端口不同,加入端口,似的发送更加明确)

    现在真的真的可以通讯了,但是我们那么多应用,可以一边聊天,一边上网。怎么区分是谁的?所以,加入端口这个概念。即可区分。

    "传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

    这里有了TCP 、、、UDP协议,她们的头部都加上了端口这个东西即可

    TCP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。

    5、应用层 (解析拿到过来的东西)

    即使TCP可以应用在stmp、http中,那么还是需要有她们各自的格式来解读。这就是应用层解决的东西

    最后变成了这样

    2020-08-06 20:47:04:

    什么是网卡?

    网卡就是把数字信号转换成光电信号的东西。这个是一个传输协议栈,所有东西都说的是传输方面的,比如物理层其实说的是东西怎么在物理层传播.

    网卡运行在CPU 

    ------------------------------

    物理层

    数据链路

    struct ethhdr {
      unsigned char h_dest[ETH_LENGTH];
      unsigned char d_dest[ETH_LENGTH];
      unsigned short h_proto;
    } s;

    网络层

    struct iphdr {
      unsigned char version:4,
                    hdrlen:4; // 虽然是4bit,可以表示15,但是单位要*4
      unsigned char tos; // 流媒体那些
      unsigned char totlen;
      unsigned short id;
      unsigned short flag:3,
                     offset:13;
      unsigned char ttl; // 网络经过一层就会减1,默认64
      unsigned char proto; // tcp/udp
      unsigned short check_sum;
    
      unsigned int s_ip;
      unsigned int d_ip;
    } c;

    传输层(UDP/TCP)

    什么是端口: 传输层那边定义的一个字段,叫端口

    struct udphdr {
      unsigned short s_port;
      unsigned short d_port;
      unsigned short length;
      unsigned short check_sum;
    };

    // TCP详解

    1. 三次握手发生在函数的哪里呢?

    客户端: connect

    服务器: listen()和accept()这两个函数之间,由系统的tcp协议栈实现的.

    第一个SYN过来后, 有一个syn队列...

    收完之后,假如accept队列。变成一个TCB(使用五元组唯一确定)..

    2. 调用send的过程: 从用户态发去内核态,然后内核态又是用协议栈发去网卡的.

    TCP是怎么保证顺序的? 网络上是无序的,通过延迟ack

    3. tcp如何确定发多少个包

    NAT:

    1。完全锥形nat:我要去808找晶晶,假如真的存在,就可以进去

    2.   ip限制锥形nat:只允许固定的IP放问数据进来。

    3.   端口限制锥形nat:ip+端口

    4.    对称nat: 锥形nat都是客户端:网关:服务器 = 1:1:N,但是对称nat就是1:N:N\

    Q1:如何判断网关nat类型

  • 相关阅读:
    Python查找最新测试报告到邮件功能
    windows下如何安装pip以及如何查看pip是否已经安装成功
    selenium之 chromedriver与chrome版本映射表(更新至v2.33)
    selenium 获取input输入框中的值的方法
    iframe 内联框架
    frameset导航框架
    html 7.28
    存储器
    递增输出带表头结点的单链表元素
    从头到尾反向输出带头结点的单链表的每个节点的值
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/8399552.html
Copyright © 2011-2022 走看看