读书笔记:TCP/IP开发基础
TCP/IP分层结构
从上到下分为应用层,传输层,网络层,数据链路层 各层的协议如图所示。
数据传输的细节
发送端 从传输层开始,会把上一层数据依次加一个报头,也就是数据封装。 接收端 从数据链路层开始,每一层去掉首部信息,也就是数据解封。 如图所示
发送方
- 在浏览器输入网址并且访问,应用层用http协议,浏览器将http报文之类的信息组成数据,发给传输层。
- 传输层 加上TCP首部,标记端口为80,web服务器的默认端口是80,发给网络层。
- 网络层 在这个数据段之前加上自己机器的ip与目的地ip,将这个ip包发给数据链路层。
- 数据链路层 将ip头前面加上自己的机器mac与目的地的mac,加上mac地址的数据称为帧,这个帧通过物理网卡以比特流的形式发到网络。
路由器
读取比特流中的IP进行选路,到达正确网段,这个网段的交换机再读取比特流的mac,找到要接收的对应机器。如果两台计算机在不同的网段,那么要经过多个路由器。
接收方
与发送方相反,用网卡接收比特流后,从下往上一路向上拆包,依次读取mac,ip,端口, 一直到应用层,发现是http协议,就调用web服务器程序,访问网址首页的文件。
接收数据处理细节
接收方处理数据如图所示
- 以太网驱动程序先看报头里面标注上层协议的字段,确定实际传输的是什么协议,有可能是IP, RARP, ARP。
- 如果是IP,再看ip报头里面的上层协议字段,看是TCP, UDP, ICMP, IGMP等等协议的哪一个。给相应的协议处理。
- 如果是TCP或者UDP,再看TCP或者UDP首部的端口号,来看给哪个用户进程。
- IP标识主机,端口号标识某一台主机上面不同的进程地址,ip和端口标识网络中唯一的进程。
额外小补充
- IP, RARP, ARP都是以太网驱动程序来封装成帧,但是IP协议属于网络层,RARP, ARP属于数据链路层。
- TCP, UDP, ICMP, IGMP都是ip协议封装成数据报,但是TCP, UDP属于传输层,ICMP, IGMP属于网络层。
- 不同协议层对数据有不一样的称呼,传输层 叫做段 ,网络层 叫做数据报 ,链路层 叫做帧。
- 模型与数据长度如图所示
应用层
DNS
也就是域名,IP难记所以用一串英文来表示这个主机,访问网站输入域名或者ip都可以,域名的内容有一定的规则。
域名是由互联网域名与地址管理机构来管理的,简称ICANN,每个国家有不同的顶级域名,例如中国.cn,日本是.jp,.cn下面的域名由CNNIC管理。
域名是主机的别名,要转换成ip,所以需要依靠DNS服务,过程如下:
- 首先用户把解析请求发给本地的域名服务器,本地的能解析那就直接得到结果。
- 如果本地的域名服务器不行,那就发给根域名服务器,依据根域名服务器返回的指针再往下一层的域名服务器找,直到最后找到ip。
端口
IP找到了主机,但是最终通信还是需要找到目的程序的。端口用来标识目的程序。 前1024个端口是留给系统使用的,自己写程序只能用1024之后的端口,端口的范围是0-2^16-1
传输层
主要是TCP和UDP。
TCP
面向连接,高可靠性(数据无丢失,数据无失序,数据无错误,数据无重复),TCP协议给应用层数据加上的TCP报头结构如下
用C语言定义是这样的:
UDP
无连接,不可靠。结构如图
网络层
主要有协议ICMP, IGMP,ARP, RARP。
IP协议
TCP/IP核心协议。数据报如果太大的话需要分片传输,到了目的地再组装还原,以此来适应不同的物理网络。
特点
- 不可靠,不能保证成功 到达,假如发生错误,例如某个路由器暂时用完了缓冲区,IP协议会丢弃数据包,发送ICMP给源端,所以说可靠性必须由更上层的TCP来保证。
- 无连接,不维护后续 的数据报的状态信息 ,每个数据报相互独立,可以不按顺序发送接收,比如一个发送者给一个接收者连续发两个数据报,两个独立的进行路由选择,可能选了不一样的路线,可能后面的更先到。
- 无状态,不会同步传输数据状态与信息,无法处理乱序和重复 的IP协议数据报。有唯一的标识 来标记每个数据报,但是不指示接收顺序。
结构
如图,因为有选项部分,所以报头长度不固定。
版本:0100是IPV4,0110是IPV6。
报头长度:本字段的数值单位是4字节,32bit,如果值是1111,也就是15,那就表示60字节。
服务类型:8个比特分别为PPPDTRCO
总长度:以字节为单位的IP数据报总长度,最大65535,也就是16bit都是1。
标识:计数器,每产生一个数据报就加1,不是序号,如果一个数据报因为太大被分片了,那几个分片的标识都会一样,以便于后面组装。
标志:3bit里面最高位不用,第二位DF=1表示路由器不对上层数据报分片,如果这个数据报不分片转发不了,就报错。最低位MF=1说明这个包是分片的,MF=0说明是最后一个分片。
片偏移:某个分片在报文的相对位置,第一个片是0,单位是8字节,所以每个分片一定是8字节的整数倍。
生存时间:又叫TTL,表示数据报到地址之前跳转多少个路由,每次经过一个路由就减1,减完了就会丢弃,返回icmp的差错报文,主要是为了防止循环转发。
协议:标识数据部分用的什么协议,1是ICMP,2是IGMP,6是TCP,17是UDP,88是IGRP,89是OSFP。
首部校验和:检测头部正确性,由于每经过一个路由器TTL都会改,所以每个路由器都要重新计算。
起止地址:标志着发出和接收的ip地址,除非使用NAT,也就是网络地址转换,不然这俩值不变。
选项:可变长字段,有一些特殊情况的可选项。
填充:ip报头单位是32bit也就是4字节,所以不是32bit整数倍就往后面补充0补充到32bit。
IP数据报分片
数据链路层一次传的数据帧的长度是MTU,以太网的MTU是1500字节。
IP数据报加上数据帧头部(链路层的头部)长度大于MTU,就要分片,片的重组只可能发生在目标主机IP层。
分片可能发生在发送方主机,也可能在中间某路由器,中间经历的不同的物理网络MTU不一样,有时候分片了还要再分。
IP地址的知识
每个IP地址分为网络号 和主机号,网络号表示属于互联网的哪一个网络,主机号表示这个网络里面的哪一台主机。借助路由器可以让IP数据报从一个网络到达另一个网络。
特殊的ip地址:
网络掩码
主机号部分全部变成0就是网络地址。
网络掩码用来计算网络地址,把ip地址和子网掩码进行与运算,就可获得网络地址。
ARP
IP数据报到达对方的IP以后,最终需要通过MAC地址来找到目的主机,所以ARP协议是用来把IP地址解析成MAC地址。
工作流程
1.广播ARP请求,里面包含IP地址。
2.目的主机收到以后,用ARP协议解析,识别出是问自己MAC,回复ARP应答包。
3.发送主机收到以后就知道MAC了,同时会把目的主机ip与MAC地址保存在ARP表,以后通过表查找。
报文结构
RARP
RARP协议,让物理机通过网关服务器的ARP表或者缓存来获取自己的ip地址。
1.发送主机发一个本地的RARP广播,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP。
2.RARP收到请求以后检查自己的RARP列表。
3.存在就回数据报,不存在就不响应。
4.发送主机如果收到了响应信息就利用得到的ip,没收到就表示初始化失败。
格式同ARP,只是帧类型 和OP的值不一样。
ICMP
用于探测网络是否连通,主机是否可达,路由是否可用,用于诊断网络。
ICMP的包,是IP报头加上ICMP的报文数据 ,IP报头中协议字段取值为1。
结构
前面8个字节,也就是上两排,每一排32bit,是ICMP报头。前4字节格式固定,后面4字节的根据种类决定。
ICMP分为差错报告报文 和查询报文。
具体细节可在需要时查阅资料。
数据链路层
功能
1.为网络层提供服务
无确定无连接服务,适合实时通信或者错误率低的通信,如以太网。
有确定无连接,适合错误率高的通信,如wifi。
有确认并且面向连接,适用于通信要求高的场合。
2.封装成帧,帧的定界与同步,透传
成帧:将网络层的分组封装,以帧的形式传输,将一段数据前后添加首部尾部,构成帧。
帧的定界与同步:首尾部做了定界,接收方应该从接收的比特流中区分帧的起始和终止。
透明传输:不管传的数据是什么样的bit组合都可以在链路上传输
3.差错控制
物理层和网络环境有可能导致传送错误,数据链路层会想办法让错误发生率降低。
4.流量控制
让通信有序,避免因为来不及接收数据造成丢失。
5.链路管理
链路的建立,维持,释放,通信前双方互相要交换一些信息,建立数据链路,传输要维持链路,传输完毕释放链路。
6.mac寻址
每一块网卡有一个唯一的mac地址