TCP/IP知识点及面试常考点总结

一. TCP/IP协议栈实现

开局一张图,计算机 络体系结构如下:

network-layers

1.物理层

功能:主要进行物理信 传输,负责A/D转换,即物理信 和数字信 之间的转换。

交互中间设备:转发器

2.数据链路层

络适配器工作在这一层,因此Mac地址属于这一层,需要进行差错控制

数据传输单位:MAC帧

交互中间设备: 桥/桥接器(bridge)

协议:以太 协议

  • 封装成帧(帧头SOH,帧EOT,中间为IP数据 ),透明传输(ESC字节填充),差错检测(循环冗余检测CRC)
  • 以太 MAC层的硬件地址,(计算机的硬件地址-MAC地址,在适配器的ROM中;软件地址-IP地址在存储器中)
  • 适配器是什么?为什么要有适配器?

    适配器( 络接口卡NIC+ROM+RAM等),适配器与局域 之间的通信通过电缆/双绞线以串行传输方式进行,适配器与计算机之间的通信通过主板上IO以并行传输方式进行。两者数据率不一致,因此适配器需要缓存。

    Mac帧格式如下图:

    mac_layer

  • 前12个字节表示目的地址和源地址(48位长);在不同 络上传输时,mac地址会不断变化
  • 接下来2个字节表示上层协议(0x0800 IP数据 )
  • 接下来数据范围(46字节-1500字节)
  • FCS,4个字节,采用CRC检验
  • 以太 协议头实现:

    #define ETH_ALEN  6struct ethhdr {   unsigned char h_dest[ETH_ALEN];  // 6个字节目的地址   unsigned char h_src[ETH_ALEN];  // 6个字节源地址   unsigned short h_proto;  // 2个字节协议};

    3. 络层

    交互中间设备:路由器

    本层主要介绍三个协议:IP协议,ICMP协议,以及ARP协议

    IP协议;数据传输单位为IP数据 ,向上为运输层提供数据(解包),向下将运输层数据封装成包进行传输

    不可靠(不能保证IP数据包成功到达目的地),无连接(每个数据 处理都是相互独立的,也不保序)

    络字节序:(4个字节的32bit值以大端字节序传输:0~7bit,8~15,16~23,24~31,因此大端字节序又称为 络字节序,因此在传输数据前,如果主机采用的是小端序,需要先转换成 络/大端字节序,再进行传输)

    接下来介绍IP协议头的实现,以下为IP数据 头部固定20个字节,如下图:

    ip_format

  • 版本:4位,IPv4/6
  • 首部长度:4位
  • 区分服务:1个字节服务类型TOS;4个bit,每一位分别表示最小时延,最大吞吐量,最高可靠性和最小费用,只能置其中1个bit为1,其它的都为0;例如Telnet将第一位置为1,表示最小时延,主要用来传输少量的交互数据。FTP文件传输要求最大吞吐量;
  • 总长度:2个字节,首部和数据合总长度(2^16)
  • 标识:2个字节,一个数据 对应一个标识(相同表示片组成同一数据包)
  • 标志:3位,最低位MF(==1 还有分片,==0没有分片);中间位DF(不能分片)
  • 片偏移:13位,较长的分组分片后,某片在原分组中的位置
  • 生存时间TTL:1个字节,数据 在 络中的寿命(最大跳数)
  • 协议:1个字节,
  • 首部检验合:2个字节,只检验数据 首部;
  • 源地址+目的地址:各4个字节
  • IP协议头实现

    struct iphdr {  unsigned char version: 4,  // 4位版本        head_len: 4;  // 4位首部长度  unsigned char tos;  // 1个字节TOS服务类型  unsigned short tot_len;  // 2个字节总长度  unsigned short id;  // 2个字节表示  unsigned short flag: 3,  // 3位标志      offset: 13;  // 13位片偏移  unsigned char ttl;  // 1个字节生存时间  unsigned char protocol;  // 1个字节协议  unsigned short check;  // 2个字节首部检验和  unsigned int saddr;  // 4个字节源地址  unsigned int daddr;  // 4个字节目的地址};

    ICMP协议( 际控制 文协议):为更有效转发IP数据 和提高交付成功机会。主要功能:确认IP是否成功到达目的地址, 告发送过程中IP包被废弃的原因和改善 络设置等。

  • ICMP询问 文类型回送请求(Echo Request 类型8)和回送应答(Echo Reply 类型0)PING(直接只用 络层,没有经过传输层)时间戳请求和回答
  • traceroute(逐一增加ttl)是ICMP差错 文类型的使用,

  • 追踪来去目的地时沿途经过的路由器:通过不断增加TTL实现,当TTL减少到0时,会返回ICMP差错 文(类型为超时)。直到到达目的IP
  • 确认路径MTU:将IP包首部的分片禁止标志位设置为1,路由器不会对大数据包分片,进而将包丢弃,并返回一个ICMP不可达消息并携带数据链路上的MTU值。不可达消息类型为“需要分片但是设置了不分片。”
  • ping是ICMP询问 文的使用,通过回送消息判断所发送的数据包死否已经成功到达对端。

    ARP协议(地址解析协议):每台主机都有一个ARP Cache(高速缓存),存有本局域 上各主机/路由器的IP地址MAC地址的映射表。通过使用ARP,找到IP对应的MAC地址,找不到则交给路由器处理(下一跳)。因此MAC地址只在本局域 有效。ARP的功能是在32bit的IP地址和采用不同 络技术的硬件地址之间提供动态映射;IP地址和MAC地址的关联保存在ARP表中,由驱动程序和操作系统完成。

    4.运输层

    络层以上的交互中间设备: 关(gateway)

    IP 络层角度:通信的端点是两台主机;运输层角度:通信端点是两台主机中的进程。

    运输层向进程通信提供通用的数据传输服务,提供了TCP/UDP两种协议

  • TCP传输控制协议:面向连接的、面向字节流的,全双工的,可靠的数据传输服务,数据传输单位为段(segment);TCP连接的端点叫做socket(IP+Port).
  • UDP用户数据 协议:无连接的,尽最大努力数据传输服务(不可靠),数据传输单位为用户数据 ,一般用在对实时性和传输效率有一定要求的场景(下载,游戏等)
  • UDP协议头:

    udp_format

    没有拥塞控制,首部开销小(8个字节)

    UDP协议头和udp数据包

    // udp头部struct udphdr {   unsigned short source;  // 源地址   unsigned short dest;  // 目的地址   unsigned short len;  // 数据 长度   unsigned short check;  // 检验和};// udp数据包struct udppkt {   struct ethhdr eh;  // 以太 协议   struct iphdr ip;  // ip协议   struct udphdr udp;  // tcp协议    // 柔性数组,没法知道数组长度 sizeof(body)==0    // 使用情况:1. 长度不确定;2.长度可以通过计算出来不越界   unsigned char body[0];};

    TCP协议头

    tcp_format

  • 源端口+目的端口:各占2个字节
  • 序 (Seq):4个字节, 文段序
  • 确认 (Ack):4个字节,期望收到对方下一个 文段第一个数据字节的序
  • 数据偏移:4位,
  • 保留:4位
  • 紧急URG:=1,表示紧急字段有效
  • ACK:=1,则Ack字段有效
  • PSH:推送,告知对方这些数据包收到以后应该马上交给上层应用,不能缓存起来
  • RST:复位,TCP出现严重差错,释放连接,重新建立连接
  • SYN:在建立连接时用来同步信 ,=1表示连接请求或者接受 文。
  • FIN:用来释放一个连接,=1表示数据发送完毕。
  • 窗口大小:2个字节,表示发送 文段一方的接受窗口
  • 校验和:2个字节,首部+数据
  • 紧急指针:URG==1才生效
  • struct tcphdr {    unsigned short sport;    unsigned short dport;    unsigned int seqnum; // seq序列 ,收到客户端,SYN==1生效    unsigned int acknum; // Ack, server/client确认, ACK==1生效    unsigned char hdrlen:4,         resv:4;    unsigned char cwr:1,         ece:1,         urg:1,         ack:1,         psh:1,  //          rst:1,          syn:1,         fin:1;    unsigned shrot cw; // 窗口大小    unsigned short check;    unsigned short urg_pointer;};

    MSS,MSL等概念

    internet_pakcet

    MSS:TCP 文段中应用数据字段的最大长度,不是TCP 文总长度。

    MTU(以太 数据帧长度46~1500字节): 最大传输单元 (MTU = MSS + TCP头20字节+IP头20字节),当IP层数据长度大于MTU时,IP层需要对数据进行分片(Fragmentation)

    路径MTU:一个包从发送端传输到接收端,中间要跨越多个 络,每条链路的MTU都可能不一样,这个通信过程中最小的MTU称为路径MTU。

    5.应用层

    最高层,应用程序之间进行通信(进程间通信),交互数据单元为(Message)

    network_proto

    二. TCP面试常考点

    PART1: TCP三次握手,四次挥手相关问题?

    下面有两张图,第一张清楚展示了从建立连接到数据传输再到最后断开连接的整个过程,第二张为状态转移图。接下来会基于这两张图对TCP的三次握手和四次挥手进行讲解。

    tcp_shake

    tcp_state

    三次握手建立连接

    1. 主动端调用connect发起连接,首先发送一个SYN包(将TCP首部SYN标记置为1),告诉被动端初始化序列 是x,这时主动端进入SYN_SENT状态,被动端处在Listen状态(调用listen后进入此状态)
    2. 被动端收到SYN包后回复ACK表明已收到,并发送自己的初始化序列 y(将TCP首部SYN标记和ACK标记都置为1),被动端把这个连接信息放入SYN队列,进入SYN_RCVD状态
    3. 主动端收到包后,回复一个ACK确认包,此时双方进入ESATABLISED状态,被动端把这个连接信息从SYN队列移除,并将其放入Accept队列中。

    四次挥手断开连接

    1. 主动端发送一个FIN包给被动端(TCP首部FIN标志置为1),表示没有数据传输,要求断开连接,这时主动端进入FIN_WAIT_1状态
    2. 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2021年2月3日
    下一篇 2021年2月3日

    相关推荐