美文网首页
笔试准备

笔试准备

作者: 什锦甜 | 来源:发表于2018-09-16 09:55 被阅读15次

    大小端

    题1

    0x20150810

    如果按照大端模式存储:从低地址到高地址:20 15 08 10
    输出从低地址到高地址:20 15 08 10

    如果按照小端模式存储:从低地址到高地址:10 08 15 20 (32位系统)
    输出从高地址到低地址:08 10 20 15

    直接打印出指针占多少字节,4字节为32位系统,8字节为64位系统。

    tcp&udp

    TCP UDP
    TCP与UDP基本区别
    1.基于连接与无连接
    2.TCP要求系统资源较多,UDP较少;
    3.UDP程序结构较简单
    4.流模式(TCP)与数据报模式(UDP);
    5.TCP保证数据正确性,UDP可能丢包
    6.TCP保证数据顺序,UDP不保证
      
    UDP应用场景:
    1.面向数据报方式
    2.网络数据大多为短消息
    3.拥有大量Client
    4.对数据安全性无特殊要求
    5.网络负担非常重,但对响应速度要求高

    具体编程时的区别
    1.socket()的参数不同
       2.UDP Server不需要调用listen和accept
       3.UDP收发数据用sendto/recvfrom函数
       4.TCP:地址信息在connect/accept时确定
       5.UDP:在sendto/recvfrom函数中每次均 需指定地址信息
       6.UDP:shutdown函数无效

    编程区别
    通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。
      SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。

    而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。

    基于上述不同,UDP和TCP编程步骤也有些不同,如下:

    TCP:
    TCP编程的服务器端一般步骤是:
      1、创建一个socket,用函数socket();
      2、设置socket属性,用函数setsockopt(); * 可选
      3、绑定IP地址、端口等信息到socket上,用函数bind();
      4、开启监听,用函数listen();
      5、接收客户端上来的连接,用函数accept();
      6、收发数据,用函数send()和recv(),或者read()和write();
      7、关闭网络连接;
      8、关闭监听;

    TCP编程的客户端一般步骤是:
      1、创建一个socket,用函数socket();
      2、设置socket属性,用函数setsockopt();* 可选
      3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
      4、设置要连接的对方的IP地址和端口等属性;
      5、连接服务器,用函数connect();
      6、收发数据,用函数send()和recv(),或者read()和write();
      7、关闭网络连接;

    UDP:
    与之对应的UDP编程步骤要简单许多,分别如下:
      UDP编程的服务器端一般步骤是:
      1、创建一个socket,用函数socket();
      2、设置socket属性,用函数setsockopt();* 可选
      3、绑定IP地址、端口等信息到socket上,用函数bind();
      4、循环接收数据,用函数recvfrom();
      5、关闭网络连接;

    UDP编程的客户端一般步骤是:
      1、创建一个socket,用函数socket();
      2、设置socket属性,用函数setsockopt();* 可选
      3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
      4、设置对方的IP地址和端口等属性;
      5、发送数据,用函数sendto();
      6、关闭网络连接;

    TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

    UDP补充:
    UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDO的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。

    TCP补充:
    TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

    TCP与UDP区别总结:
    1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
    2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
    3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
    UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
    4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
    5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
    6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

    协议

    RARP:根据MAC地址查找对应的IP地址。
    NAT把公网的IP地址转换为私网的IP地址。
    ICMP用于控制数据报传送中的差错情况。
    DHCP用于集中管理网络中的IP地址分配。

    64位系统:
    Size of char is: 1
    Size of unsigned char is: 1
    Size of signed char is: 1
    size of int is: 4
    Size of short is: 2
    Size of long is: 8
    Size of long int is: 8
    Size of signed int is: 4
    Size of unsigned int is: 4
    Size of unsigned long int is: 8

    Size of long long int is: 8
    Size of unsigned long long is: 8
    Size of float is: 4
    Size of double is: 8
    Size of long double is: 16
    Size of (void *) is: 8
    Size of (char *) is: 8
    Size of (int *) is: 8
    Size of (long *) is: 8
    Size of (long long *) is: 8
    Size of (float *) is: 8
    Size of (double *) is: 8
    所有指针都是占8字节

    --- 32位系统
    Size of char is: 1
    Size of unsigned char is: 1
    Size of signed char is: 1

    Size of int is: 4
    Size of short is: 2
    Size of long is: 4
    Size of long int is: 4
    Size of signed int is: 4
    Size of unsigned int is: 4
    Size of unsigned long int is: 4
    Size of long long int is: 8
    Size of unsigned long long is: 8
    Size of float is: 4
    Size of double is: 8
    Size of long double is: 8
    Size of (void *) is: 4
    Size of (char *) is: 4
    Size of (int *) is: 4
    Size of (long *) is: 4
    Size of (long long *) is: 4
    Size of (float *) is: 4
    Size of (double *) is: 4
    所有指针都是占4字节

    内存对齐

    **1.什么是内存对齐

    假设我们同时声明两个变量:

    char a;

    short b;

    用&(取地址符号)观察变量a,

    b的地址的话,我们会发现(以16位CPU为例):** 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004。 **那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用。因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的。如果变量b的地址是0x0001的话,那么CPU就需要先从0x0000中读取一个short,取它的高8位放入b的低8位,然后再从0x0002中读取下一个short,取它的低8位放入b的高8位中,这样的话,为了获得b的值,CPU需要进行了两次读操作。

    但是如果b的地址为0x0002,

    那么CPU只需一次读操作就可以获得b的值了。所以编译器为了优化代码,往往会根据变量的大小,将其指定到合适的位置,即称为内存对齐(对变量b做内存对齐,a、b之间的内存被浪费,a并未多占内存)。

    2.结构体内存对齐规则(请记住三条内存规则(在没有#pragam pack宏的情况下

    结构体所占用的内存与其成员在结构体中的声明顺序有关,其成员的内存对齐规则如下:

    (1)每个成员分别按自己的对齐字节数和PPB(指定的对齐字节数,32位机默认为4)两个字节数最小的那个对齐,这样可以最小化长度。如在32bit的机器上,int的大小为4,因此int存储的位置都是4的整数倍的位置开始存储。

    (2)复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,结构体数组的时候,可以最小化长度。

    (3)结构体对齐后的长度必须是成员中最大的对齐参数(PPB)的整数倍,这样在处理数组时可以保证每一项都边界对齐。

    (4)结构体作为数据成员的对齐规则:在一个struct中包含另一个struct,内部struct应该以它的最大数据成员大小的整数倍开始存储。如 struct A 中包含 struct B, struct B 中包含数据成员 char, int, double,则 struct B 应该以sizeof(double)=8的整数倍为起始地址。**

    3.实例演示:

    struct A

    {

    char a;   //内存位置: [0]

    double b;  // 内存位置: [8]...[15]

    int c;    // 内存位置: [16]...[19]  ----  规则1

    };     // 内存大小:sizeof(A) = (1+7) + 8 + (4+4) = 24, 补齐[20]...[23]  ----  规则3

    struct B

    {

    int a,  // 内存位置: [0]...[3]

    A b,   // 内存位置: [8]...[31]  ----  规则2

    char c, // 内存位置: [32]

    };     // 内存大小:sizeof(B) = (4+4) + 24 + (1+7) = 40, 补齐[33]...[39]

    *注释:(1+7)表示该数据成员大小为1,补齐7位;(4+4)同理。

    速率传输

    image.png

    交换机为独占带宽,即每个端口数据通过率为为最大100Mb/s。注意单位是Mb。因此最短时间为:
    1GB/(100Mb/s)=1024MB/(12.5MB/s)=81.92s。
    其中:100Mb/8=12.5MB,即8比特等于1字节。

    image.png

    A 答案 无上邻也无下邻的 空闲分区数加1
    B 答案 有上邻无下邻的 当前空闲分区和上邻的合并 然后起始位置改变成上邻空闲区的位置 分区数不变
    C 答案 有下邻无上邻 和下邻合并 起始位置不变 增加空闲区的大小
    D 答案 有上邻也有下邻 此时有2个空闲区 此时这三个空闲区合并 分区数-1

    image.png image.png

    跳过FIN_WAIT_2,证明被动方也完成了数据传输任务,直接把ACK和FIN一起发给了主动方,因此主动方从FIN_WAIT_1直接跳过FIN_WAIT_2进入TIME_WAIT

    也就是省略了那步 服务端还有数据未发送完 先ACK确认再FIN关闭 客户端发起关闭时 服务端也无数据要传

    image.png
    image.png
    image.png image.png

    相关文章

      网友评论

          本文标题:笔试准备

          本文链接:https://www.haomeiwen.com/subject/enpxnftx.html