ISO/OSI七层参考模型
TCP/IP四层模型
ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。
应用层: FTP,TELNET为了完成一定的用户需求,自定义协议,QQ协议
传输层:TCP UDP
网络层: ICMP,IP,IGMP
数据链路层: ARP,RARP硬件接口
运行FTP协议的两台主机:
每个层次具有自己的协议,每层之间进行通信;他们的语言一致,我们可以看作是A进程和B进程之间进行对等通信,也就是虚电路(并不是真正的建立连接线)对等数据传输的是逻辑流,例如现在有两个人通过手机进行通信,好像就在耳边,其实是通过电磁波。
封装:
分用:
端口:
端口由IANA分配和控制他们紧密绑定一些服务:0~1023
注册端口:1024~49151,在这之间端口松散的绑定一些服务
动态或者私有(临时)端口 49152~65535(实际上从1024)开始分配
链路层:
以太网的帧格式
链路层的数据包,称为以太网帧; 链路层不识别IP地址[因为IP地址是逻辑地址],链路层识别物理网卡MAC地址[硬件地址]; 需要根据IP地址(逻辑地址)找到对方的MAC地址(ARP地址解析协议)[MAC —> IP地址方向地址解析];MAC->IP 反向地址解析(RARP协议); 类型(2字节)用来区分IP,ARP,RARP。
//以太网首部代码 struct ethernet_hdr { char dest_mac[6]; char src_mac[6]; short protocol; };
MTU/路径MTU
链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。另外,多个网络的链路层可能有不同的MTU,选择通信路径中较小的MTU,称作路径MTU;但是分片会降低网络的通信效率,应该尽量避免。
ARP地址解析协议
本地ARP高速缓存
//ARP首部代码 struct arp_hdr { unsigned short hwtype; // 固定1 unsigned short protype; // 固定0x0800(代表为IP协议做请求) unsigned char hwaddrlen; // 固定6(即MAC地址长度) unsigned char proaddrlen; // 固定4 (即IP地址长度) unsigned short opcode; // Request - 1, Reply - 0x0002 unsigned char sender_mac[6]; // 发送者MAC unsigned char sender_ip[4]; // 发送者IP unsigned char dest_mac[6]; // 接收者MAC unsigned char dest_ip[4]; // 接收者IP };
源端和目的端都将加入ARP缓冲区。
RARP反向地址解析协议,适用于无盘工作站,IP一般存于配置文件中
这个时候要想获取IP地址,就通过RARP协议,通过向RARP服务器发送请求
网络层:
IP数据报
首部最大长度是15*4=60个字节,15最为单位,选项最多有40个字节。
协议类型8位 判断高层是TCP还是UDP,头部校验和校验IP头部的完整性,并不校验数据的完整性。
服务类型:
IP数据报最大可达65535;分片共享一个标识号
网际校验和算法: http://blog.csdn.net/zhq651/article/details/8515575
//IP首部代码 struct ip_hdr { char ver_hl; char tos; unsigned short len; unsigned short id; unsigned short fragment; char ttl; char protocol; unsigned short hdr_chksum; char src_ip [4]; char dest_ip [4]; };路由过程:
顺序:搜索匹配的主机地址
搜索网络地址
搜索默认表项
ICMP协议ICMP协议用于传递差错信息、时间、回显、网络信息等控制数据,工作于网络层(IP),Ping程序使用ICMP协议实现。
//ICMP首部代码 struct icmp_hdr { char type; // ICMP报文类型 char code; // “子类型” unsigned short icmpchksum; // 校验和 };UDP报文格式
//UDP首部代码 struct udp_hdr { unsigned short src_port; unsigned short dest_port; unsigned short len; unsigned short chksum; };
TCP报文头部:
连接建立三次握手
连接终止四次挥手
注:慢启动中的慢 是指基数比较小。
步骤a:应用程序ping会判断发送的是主机名还是IP地址,调用函数gethostbyname()解析主机机B,将主机名转换成一个32位的IP地址。这个过程叫做DNS域名解析.
步骤b:ping程序向目的IP地址发送一个ICMP的ECHO包
步骤c:将目标主机的IP地址转换为48位硬件地址,在局域网内发送ARP请求广播,查找主机B的硬件地址。
步骤d:主机B的ARP协议层接收到主机A的ARP请求后,将本机的硬件地址填充到应答包,发送ARP应答到主机A。
步骤e:发送ICMP数据包到主机B
步骤f:主机B接收到主机A的ICMP包,发送响应包。
步骤g:主机A接收到主机B的ICMP包响应包。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Linux下的socket编程实践(一) 网络基本知识以及 TCP/IP简述
原文地址:http://blog.csdn.net/nk_test/article/details/48847449