“
”
一. TCP/IP协议栈实现
开局一张图,计算机 络体系结构如下:
network-layers
1.物理层
功能:主要进行物理信 传输,负责A/D转换,即物理信 和数字信 之间的转换。
交互中间设备:转发器
2.数据链路层
络适配器工作在这一层,因此Mac地址属于这一层,需要进行差错控制等
数据传输单位:MAC帧
交互中间设备: 桥/桥接器(bridge)
协议:以太 协议
适配器是什么?为什么要有适配器?
适配器( 络接口卡NIC+ROM+RAM等),适配器与局域 之间的通信通过电缆/双绞线以串行传输方式进行,适配器与计算机之间的通信通过主板上IO以并行传输方式进行。两者数据率不一致,因此适配器需要缓存。
Mac帧格式如下图:
mac_layer
以太 协议头实现:
#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
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包被废弃的原因和改善 络设置等。
traceroute(逐一增加ttl)是ICMP差错 文类型的使用,
ping是ICMP询问 文的使用,通过回送消息判断所发送的数据包死否已经成功到达对端。
ARP协议(地址解析协议):每台主机都有一个ARP Cache(高速缓存),存有本局域 上各主机/路由器的IP地址到MAC地址的映射表。通过使用ARP,找到IP对应的MAC地址,找不到则交给路由器处理(下一跳)。因此MAC地址只在本局域 有效。ARP的功能是在32bit的IP地址和采用不同 络技术的硬件地址之间提供动态映射;IP地址和MAC地址的关联保存在ARP表中,由驱动程序和操作系统完成。
4.运输层
络层以上的交互中间设备: 关(gateway)
IP 络层角度:通信的端点是两台主机;运输层角度:通信端点是两台主机中的进程。
运输层向进程通信提供通用的数据传输服务,提供了TCP/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
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
三次握手建立连接
- 主动端调用connect发起连接,首先发送一个SYN包(将TCP首部SYN标记置为1),告诉被动端初始化序列 是x,这时主动端进入SYN_SENT状态,被动端处在Listen状态(调用listen后进入此状态)
- 被动端收到SYN包后回复ACK表明已收到,并发送自己的初始化序列 y(将TCP首部SYN标记和ACK标记都置为1),被动端把这个连接信息放入SYN队列,进入SYN_RCVD状态
- 主动端收到包后,回复一个ACK确认包,此时双方进入ESATABLISED状态,被动端把这个连接信息从SYN队列移除,并将其放入Accept队列中。
四次挥手断开连接
- 主动端发送一个FIN包给被动端(TCP首部FIN标志置为1),表示没有数据传输,要求断开连接,这时主动端进入FIN_WAIT_1状态
-
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!