Linux网络开发——TCP/IP基础

一:网络模型(ISO/OSI参考模型)

开放系统互联模型(ISO/OSI参考模型,也叫七层网络模型)
层次 作用 传输单位(统称为PDU) 例子和类比
应用层 与应用程序界面沟通,以达到展示给用户的目的:HTTP、HTTPS、FTP、SSH、SMTP、TELNET、POP3等 APDU 经理:写了一份邮件草稿
表示层 处理数据格式、压缩、数据加密 PPDU 助理:修改错字,对格式重新编排
会话层 建立、维护、管理会话 SPDU 秘书:找到收件人地址,将信封封好
传输层 建立端到端连接,提供可靠的数据传输服务,它检测路由器丢弃的包,然后产生重传请求,也能够将乱序收到的包重新排序 segment 司机:将信件带到邮局,到这一层,公司事务完成
网络层 寻址和路由选择 分组(packet、包) 排序工人:将信件按地区分开,邮局事务开始
数据链路层 提供介质访问、链路管理 帧(frame) 包装工人:将信件包装成一叠
物理层 提供比特流传输 比特流(bit) 搬运工人:压箱,运输
四层网络模型

实际广泛应用的模型

层次 对应关系 协议(通信的基础,是协议一致,就好像你用英语,我也要用英语,才能沟通)
应用层 对应于应用层、表示层、会话层 HTTP、FTP、telnet,QQ协议等,为完成特定的应用功能而制定的协议
传输层 对应于传输层 TCP、UDP
网络层 对应于网络层 ICMP、IP、IGMP
链路层 对应于数据链路层和物理层 ARP(地址转化协议,将逻辑地址(IP地址)转化为物理地址)、RARP(将物理地址转化为IP地址)
封装/解封装

每一层的协议通过对数据加头部进行封装

  1. http协议添加的 httpHeader(应用层)
  2. TCP在http头部的基础上,添加tcp头部(传输层)
  3. IP在TCP的基础上,添加IP头部(网络层)
  4. 添加以太网头部(链路层)

解封就是去掉头部的过程

端口:找到应用程序入口

IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)是负责协调一些使Internet正常运作的机构
下面的端口分配只是通常情况,也有例外,如SUN的RPC从32768开始

端口类型 作用
众所周知的端口 0-1023,IANA管理,通常来说,表明了某种服务协议,比如21表示的是ftp服务端口
注册端口 1024-49151,IANA管理,松散的绑定于一些服务,如3306是mysql短偶,8080是tomcat服务器端口
动态或私有端口 IANA不管这些端口

二:链路层相关概念和协议

最大传输单元(MTU)/ 路径MTU
  • 以太网和IEEE 802.3对数据帧的长度都有限制,分别为 1500 和 1492,这个限制叫做MTU(Maximum Transmission Unit),一般来说,最大为1500字节,最小为46字节,不足46字节,要补全。
  • 如果IP层要传的数据报大于MTU,IP层就要进行分片,让每片都小于MTU。
  • 当网络上,两台主机进行通讯时,要经过多个网络,每个网络的链路层MTU都有可能不一样,其中最小的MTU叫做路径MTU。
以太网帧格式
帧: 目的地址 源地址 类型 数据
长度(字节): 6 6 2 46-1500
ICMP(网络层 or IP层协议)

地址解析,链路层将逻辑地址(IP)转化为物理地址(MAC)时,有可能出现错误,比如IP地址对应的物理地址是不存在的,这时候需要通过一种机制通知源端(发送端),这种机制就是ICMP协议。
ICMP协议: 用于传递差错信息,时间、回显、网络信息等控制数据
例如:

1:当我们使用IP地址将数据封装成数据帧后,在网络上通过路由器多次跳转,最终发现其对应的物理地址不存在,这时候,就要将错误信息使用ICMP协议进行封装,返回给源端。

2:又比如,IP层会对要传输的数据进行分包,如果分包出错,包的大小大于链路成的路径MTU(最大传输的包大小),传输必定会出错,错误信息也是通过ICMP协议返回的。

实际上,ping 就是使用ICMP实现的

ARP:地址解析协议

作用是映射IP地址到MAC地址

比如 10.0.0.2 要发送一个包到 10.0.0.1 ,数据链路层会通过广播的形式,对网络上的所有主机发送10.0.0.1,10.0.0.1的主机得到响应后,就会将自己的物理地址返回。

本地ARP: ARP高速缓存,第一次找到物理地址后,就会将物理地址保存在这。
在这里插入图片描述
例子,ping的工作原理:

  1. 应用程序ping会判断发送的是主机名还是IP地址,如果是主机名,就调用gethostbyname()解析主机B,将主机名转换成一个32位的IP地址,这个过程就叫DNS域名解析。
  2. ping程序向目标IP发动一个ICMP的ECHO包。
  3. 在局域网内发动ARP请求广播,查找主机B的硬件地址。
  4. 主机B的ARP协议层收到主机A的ARP请求后,将本机的硬件地址填充到答应包,发送ARP应答到主机A。
  5. 发送ICMP数据包到主机B。
  6. 主机B接收到主机A的ICMP包,发送响应包。
  7. 主机A收到主机B的ICMP响应包。
RARP:反向地址解析协议

通常用于无盘工作站中,无盘工作站由于没有硬盘,不知道自己的ip地址,只知道自己的物理地址,在发送数据前,先将自己的物理地址发送给RARP服务器,RARP服务器返回它的IP地址,这个过程就叫做反向地址解析协议。

三:网络层的相关概念和协议

IP数据报格式
版本号(4位):ipv4值为4,ipv6值为6 首部长度(4位):(0101-1111,即5-15 分别乘以4等于 20-60) 服务类型(8位):包括3位的优先权,已忽略,4位的服务类型,分别为D(最小延迟)T(最大吞吐)R(最高可靠性)F(最小费用),还有一位的保留位 总长度:(16位)最大65535,包含IP的头部和数据部分
标识(16位):每发送一次+1,最大为65535,到了最大值后,从1开始 标志(3位):第一位不使用,第二位DF(Don't Fragment)如果为1表示传输的数据报超过最大传输单元,数据报会被丢弃,并发送ICMP差错报文。第三位MF(More Fragment)表示是否有更多的片,如为1,说明后续还有分片,最后一片MF为0 片偏移(13位):分片后,当前片相对于原数据的偏移量,传输层重排列的依据
生存时间TTL(8位):表示数据报最多可通过的路由器的数量,数据报每经过一个路由器,TTL减1,减为0时丢弃,并发送ICMP报文通知源主机。TTL可以避免数据报在路由器之间不断循环 协议类型(8位):表示IP层上承载的是哪个高级协议,1:ICMP 2:IGMP 6:TCP 17:UDP,通过协议类型,协议栈知道该交给上层的哪个协议处理。 头部校验和(16位):使用网际校验和保证头部数据的完整性
源IP地址(32位):
目的IP地址(32位):
选项(32位): 填充(选项必须是4的整数倍,不足就用0填充)
数据
网际校验和

反码算数运算:
两个数进行二进制反码求和的运算很简单。它的规则是从低位到高位逐列进行计算。0和0相加是0,0和1相加是1,1和1相加是0但要产生一个进位1,加到下一列。如果最高位相加后产生进位,则最后得到的结果要加1。

网际校验和算法:
发送方: 先把被校验的数据划分为许多16位字的序列。如果数据的字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。用反码算数运算把所有16位字相加后,然后再对和取反码,便得到校验和。

接收方: 将收到的数据报(包括校验和字段),将所有16位字再使用反码算数运算相加一次,将得到的和取反,即得出校验和的计算结果。如果数据报在传输过程中没有任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。

路由
  1. 查询是否在同一个网段:将本机ip地址和目标主机ip地址与子网掩码做与运算,看结果是否相同(如192.168.0.5 与 255.255.255.0做与运算的结果就是 192.168.0.0),如果相同就在同一个网段。
  2. 查路由表:如果不在同一个网段,就查询本机的路由表,看是否有到目标ip的路由信息,如果没有查到,就会将信息发送到默认网关,如 192.168.0.1。
  3. 知道了下一跳的地址,主机A开始封装,信息如下
    在这里插入图片描述
    在这里插入图片描述
    之后一跳一跳的,直到到达主机B

TCP

TCP特点

传输的单位是 segment(段)

  1. 基于字节流:传输层没有给定传输的边界,因此存在粘包问题
  2. 面向连接:先建立连接,再传输数据
  3. 可靠传输:通过网际校验和来保证传输数据的完整性(不丢失、重复)
  4. 缓存传输:不会立即传输数据,而是选择一个最佳的时间
  5. 全双工:发送数据的同时,也可以接收数据
  6. 流量控制:通过窗口机制提供流量控制
TCP报文格式
IP头部 tcp头部 tcp数据

下面是tcp头部和数据具体组成
在这里插入图片描述
序号: 表示报文中,第一个字节在原数据中的序号
确认号: 仅当ACK标志为1时有效,确认号表示期望收到的下一个字节的序号
头部长度: 头部最长60个字节
6个标志位:

标志位 含义
URG 紧急指针有效
ACK 确认序号有效
PSH 接收方应尽快将这个报文段交给应用层
RST 连接重置
SYN 同步序号用来发起一个连接
FIN 表示將要終止一个连接

窗口大小: 用于流量控制。
检验和: 网际校验和,用于保证数据的完备性。
紧急指针: 是一个正的偏移量,与序号字段中的值向相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项: 常见的如最大传输报文MSS ,表示本端能够接收的最大长度的报文段,默认是536,加上tcp头部20字节,ip头部20字节,就是576字节到IP层。如果报文长度大于链路层的限制(MTU),IP层就要进行分包。为了避免tcp层分包,我们一般设置512字节一个包。

三次握手

在这里插入图片描述
为什么是三次而不是两次?
由于tcp连接是一种全双工通讯,连接的双方都可以发送和接收数据

  1. a向b发送数据。
  2. b收到数据后,向a表示确认能够收到数据,向a发送确认。
  3. a收到确认后,表示确认能够收到b的数据,连接建立。

之所以是三次,因为收发双方都要确认对方能够发送和接收数据

三次握手具体过程
首先说两个标志位的意思:
SYN:表示期望发起连接
ACK:表示确认收到请求

  1. A发起一个连接请求,符号 SYN= a
  2. B收到后,返回一个确认符 ACK=a+1,并发起一个连接请求符 SYN=b
  3. A收到确认符,是自己所期望的 a+1,还收到一个连接请求符 b,对请求进行确认,发动一个确认符 ACK=b+1
  4. B收到确认符,发现是自己所期望的 b+1,连接建立

发起两次,确认两次,一共四次,所以要三次握手

四次挥手

在这里插入图片描述
标志位FIN: 表示期望终止连接
过程:

  1. 由于是终止连接,所以A在发起终止时,先要确认收到了之前的包,发送ACK=y,然后发起终止,FIN=x
  2. B收到A发起的终止后,回复一个确认包 ACK=x+1

可以描述为:A告诉B,我不会向你发送数据了,B收到,告诉A,我知道了。 A->B的连接终止

  1. B紧接着向A发起终止,FIN=y
  2. A收到B发起的终止,发送一个确认符 ACK=y+1

B->A的连接终止,至此,双方连接终止完成

如何保证可靠性

首先说说不可靠表现在哪些地方

  1. 差错:TCP通过校验和来保证
  2. 丢包:超时重传 + 确认机制
  3. 失序:TCP发送的每个数据段有一个序号,接收端会根据序号对数据进行重排
  4. 重复:序号机制同样可以保证不重复

数据发送过程

  • TCP将数据划分成最适合发送的数据块,称为段,传递给IP层
  • 当TCP发出一个段后,启动一个定制器,等待接收端确认收到这个报文段。如果没能及时收到,将重新发送。
  • 当TCP收到另一端的数据,将发送一个确认,但并不是立即发送,会推迟几分之一秒。
  • TCP将保持它的首部和校验和,目的是检测数据在传输过程中的任何变化。如果收到端的校验和有差错,TCP将丢弃这个报文,并不确认(导致对方超时重传)。
  • TCP承载于IP数据报,而IP数据报的到达可能会失序,因此TCP报文段的到达也有可能失序。TCP将对收到的数据进行重排序。
  • TCP还能提供流量控制。

滑动窗口协议和UDP

滑动窗口协议

用于流量控制
A一直向B发送数据,直到达到窗口上限
在这里插入图片描述
B 向A返回1-6的确认信息,窗口向后滑动,A删除1-6的数据在这里插入图片描述
由于删除了B已经收到的数据,窗口向后滑动,可以发送剩下的数据包
在这里插入图片描述
B的确认消息(1-6)发出后,B的窗口也往后移。在这里插入图片描述
此时1-6就是收到的字节,应用程序可以读取
在这里插入图片描述
数据包7、8、9丢失,这个时候B发送确认7,和选择性确认,让A重新发7、8、9
在这里插入图片描述
缓存使用完之后,滑动窗口归0,缓存可以重复使用。
之所以说滑动窗口可以节约流量,就是他对发送速 度进行了控制,预防应用程序发送的数据超过了对方的缓冲区。

UDP特点
  • 无连接
  • 不可靠
  • 高效
UDP报文格式

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/goldfish3/article/details/89141977
今日推荐