Linux C/C++ 读书笔记:TCP/IP基础

读书笔记:TCP/IP开发基础

TCP/IP分层结构

从上到下分为应用层,传输层,网络层,数据链路层 各层的协议如图所示。

数据传输的细节

发送端 从传输层开始,会把上一层数据依次加一个报头,也就是数据封装。 接收端 从数据链路层开始,每一层去掉首部信息,也就是数据解封。 如图所示

发送方

  1. 在浏览器输入网址并且访问,应用层用http协议,浏览器将http报文之类的信息组成数据,发给传输层。
  2. 传输层 加上TCP首部,标记端口为80,web服务器的默认端口是80,发给网络层。
  3. 网络层 在这个数据段之前加上自己机器的ip与目的地ip,将这个ip包发给数据链路层。
  4. 数据链路层 将ip头前面加上自己的机器mac与目的地的mac,加上mac地址的数据称为帧,这个帧通过物理网卡以比特流的形式发到网络。

路由器

读取比特流中的IP进行选路,到达正确网段,这个网段的交换机再读取比特流的mac,找到要接收的对应机器。如果两台计算机在不同的网段,那么要经过多个路由器。

接收方

与发送方相反,用网卡接收比特流后,从下往上一路向上拆包,依次读取mac,ip,端口, 一直到应用层,发现是http协议,就调用web服务器程序,访问网址首页的文件。

接收数据处理细节

接收方处理数据如图所示

  1. 以太网驱动程序先看报头里面标注上层协议的字段,确定实际传输的是什么协议,有可能是IP, RARP, ARP。
  2. 如果是IP,再看ip报头里面的上层协议字段,看是TCP, UDP, ICMP, IGMP等等协议的哪一个。给相应的协议处理。
  3. 如果是TCP或者UDP,再看TCP或者UDP首部的端口号,来看给哪个用户进程。
  4. IP标识主机,端口号标识某一台主机上面不同的进程地址,ip和端口标识网络中唯一的进程

额外小补充

  1. IP, RARP, ARP都是以太网驱动程序来封装成帧,但是IP协议属于网络层,RARP, ARP属于数据链路层
  2. TCP, UDP, ICMP, IGMP都是ip协议封装成数据报,但是TCP, UDP属于传输层,ICMP, IGMP属于网络层
  3. 不同协议层对数据有不一样的称呼,传输层 叫做网络层 叫做数据报链路层 叫做
  4. 模型与数据长度如图所示

应用层

DNS

也就是域名,IP难记所以用一串英文来表示这个主机,访问网站输入域名或者ip都可以,域名的内容有一定的规则。

域名是由互联网域名与地址管理机构来管理的,简称ICANN,每个国家有不同的顶级域名,例如中国.cn日本是.jp,.cn下面的域名由CNNIC管理。

域名是主机的别名,要转换成ip,所以需要依靠DNS服务,过程如下:

  1. 首先用户把解析请求发给本地的域名服务器,本地的能解析那就直接得到结果。
  2. 如果本地的域名服务器不行,那就发给根域名服务器,依据根域名服务器返回的指针再往下一层的域名服务器找,直到最后找到ip。

端口

IP找到了主机,但是最终通信还是需要找到目的程序的。端口用来标识目的程序。 前1024个端口是留给系统使用的,自己写程序只能用1024之后的端口,端口的范围是0-2^16-1

传输层

主要是TCP和UDP。

TCP

面向连接,高可靠性(数据无丢失,数据无失序,数据无错误,数据无重复),TCP协议给应用层数据加上的TCP报头结构如下

用C语言定义是这样的:

UDP

无连接,不可靠。结构如图

网络层

主要有协议ICMP, IGMP,ARP, RARP。

IP协议

TCP/IP核心协议。数据报如果太大的话需要分片传输,到了目的地再组装还原,以此来适应不同的物理网络。

特点

  1. 不可靠,不能保证成功 到达,假如发生错误,例如某个路由器暂时用完了缓冲区,IP协议会丢弃数据包,发送ICMP给源端,所以说可靠性必须由更上层的TCP来保证。
  2. 无连接,不维护后续 的数据报的状态信息 ,每个数据报相互独立,可以不按顺序发送接收,比如一个发送者给一个接收者连续发两个数据报,两个独立的进行路由选择,可能选了不一样的路线,可能后面的更先到。
  3. 无状态,不会同步传输数据状态与信息,无法处理乱序和重复 的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地址

相关推荐
GZ_TOGOGO23 分钟前
【2024最新】华为HCIE认证考试流程
大数据·人工智能·网络协议·网络安全·华为
三金121381 小时前
SpringIoC容器的初识
网络·网络协议·rpc
杨哥带你写代码1 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries2 小时前
读《show your work》的一点感悟
后端
A尘埃2 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23072 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code2 小时前
(Django)初步使用
后端·python·django
代码之光_19802 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
编程老船长2 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
IT果果日记3 小时前
DataX+Crontab实现多任务顺序定时同步
后端