《图解TCP/IP》读书笔记

发布于:2023-01-17 ⋅ 阅读:(236) ⋅ 点赞:(0)

简介

因为ISO七层模型既复杂又不实用,所以现在应用最广泛的其实是我们平时经常听到的TCP/IP协议,它就是一个四层协议的协议族,只不过因为TCP/IP是其中最核心的协议,所以平时统称为TCP/IP协议,其实这个协议族里面还有其他协议,比如HTTP、FTP、SMTP等;此外本篇文章还粗略归纳了一下TCP协议的“三次握手和四次挥手”,UDP协议的特点以及它同TCP协议的不同之处,IP地址协议以及路由协议。

一、TCP分层框架

下图是TCP/IP四层协议族与ISO七层模型的一个分层框架对比图,从上往下依次是应用层、会话层、表示层、传输层、网络层、数据链路层、物理层。

假如我想在机器A上,发送一条"Hello World"到机器B,这个通讯过程是个什么样子呢?

首先机器A的应用层将消息内容"Hello World"打包,然后经由传输层加上双方的端口号,网络层加上双方的IP地址,链路层加上双方的Mac地址,经过多个路由器和网关,最终到达机器B,然后机器B再反过来解析出消息内容"Hello World"

简化之后的路径就是:消息实体+端口号+IP地址+Mac地址,封装发送,收到消息后,再反过来解包操作

下面我们从上往下,依次介绍各个分层的作用:

应用层:

应用层是OSI参考模型的最高层,它是确定应用进程之间的通信性质以满足用户需要、负责用户信息的语义表示并在两个通信者间进行语义匹配的

比如SMTP协议,虽然不同公司的邮箱格式不尽相同,但是都可以解析对方发来的邮件内容,就是因为他们都遵循SMTP协议。

表示层

表示层主要是上层用户解决用户信息的语法表示问题,其主要功能是完成数据转换、数据压缩及加密。

会话层:

它虽然不参与具体的数据传输,但它却对数据传输进行管理,会话层建立在两个互相通信的应用进程之间,进行数据交互的组织协调。

传输层:

传输层是网络体系结构中的中高低层间的衔接的接口,主要负责处理数据报文错误和数据包的发送接收次序等传输问题。它可以决定数据要传输到远程机器的哪个程序(端口),同时要表明数据来自源机器的哪个程序(端口),实现端口之间的通讯。

比如本地跑一个测试程序A,监听的是80端口;远程跑的测试程序B,监听的是8080端口;

那么传输层就会把本机的80端口和远程的80端口都加到数据包上;

这样远程机器解析数据时,就知道要把数据传给哪个程序。

网络层:

网络层传输的数据单位是分组或被称为“Packet”的数据包,它通过路由选择算法为网络分组选择最佳路径,从而实现拥塞控制和网络互联等功能。其实主要就是为了防止网络跟公共交通似的发生拥堵,在传输过程中万一发生数据块丢失的话,可以有迹可循,重新连接和补发送。可指定双方的IP地址,并进行路由的寻址和转发。这里要明白一点就是,远程机器的IP地址不是一次跳转就可以到达的,要通过路由器和网关的多次跳转,才会到达。

数据链路层

在各通信实体间建立数据链路联接,通过网桥和交换机来传输以“帧”为单位的数据流,它主要功能是为上层的网络层提供容错控制和流量控制服务。它可以指定远程机器的Mac地址(确保不会发错地方),以及本机的Mac地址。

既然有了Mac地址来作为机器的唯一ID,为啥还要有网络层的IP地址呢?

原因有两个:1. IP是会变化的,有可能今天你跟机器A在聊天,明天就变成机器B了,当然会乱掉了;2. 现在的电脑太多了,数以千万计,从这么多电脑中找出某一个Mac地址,效率很低;但是IP不一样,IP是由网段划分的,有点类似于邮编,这样就可以分段寻址,效率高很多。

物理层:

位于ISO参考模型的最底层,作用是通过网卡和集线器(Hub)和中继器提供一个物理连接,传输一种叫作“比特流”的数据流。

TCP的报文格式如下:

  • 序列号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  • 确认号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
  • 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:URG:urgent紧急;ACK:acknowledgement确认;PSH:push传送;RST:reset重置;SYN:synchronous建立连接;FIN:finish结束。

二、TCP的三次握手和四次挥手

三次握手

三次握手就是建立连接的过程,示意图如下所示

我们来再把流程简化一点,就是:机器A发送连接请求到机器B -> 机器B收到后,确认并发送同步信号 -> 机器A收到确认信号后,再次发送确认信号到机器B。

TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。

刚开始的时候,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。

1.第一次握手

客户端向服务端发送连接请求报文段。该报文段的头部中同步SYN=1,确认ACK=0,同时选择一个初始序号seq=x。请求发送后,客户端便进入SYN-SENT状态。

  • SYN=1,ACK=0表示该报文段为连接请求报文

  • x为本次TCP通信的字节流的初始序号

  • TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号

2.第二次握手

服务端收到连接请求报文段后,如果同意连接,会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。发送完应答后服务端进入SYN-RCVD状态。

  • SYN=1,ACK=1表示该报文段为连接同意的应答报文

  • seq=y表示服务端作为发送者时,发送字节流中的第一个字节序号

  • ack=x+1表示服务端希望客户端发送的下一个数据报初始序号是从x+1开始

3.第三次握手

客户端收到服务端连接同意的应答后,还会向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。

客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

具体见下图:

3.1、TCP建立连接为什么是三次握手,而不是两次或四次?

首先应该清楚一点:不论握手多少次都不能确认一条信道一定是“可靠”的,但通过3次握手可以至少确认它是“可用”的,再往上加握手次数不过是提高它是“可用”的这个结论的可信度。也就是说任意次的握手都是“不可靠”的,握手成功只能说明握手时的通信是正常的,并不能保证握手后的通信是正常的。握手只能保证尽可能的可靠,而不可能保证绝对可靠。

这里面涉及到几个关键词,下面列出一一说明下。

标志关键词

SYN(Synchronize Sequence Numbers),同步信号,表示打算建立连接时的一个信号

ACK(Acknowledgement),数据确认信号,表示是否确认收到数据

状态关键词

LISTENING,监听状态,表示还没开始建立连接,正在监听等待连接的到来

SYN_SENT,SYN已发送,表示SYN已经发送,但是成功不成功还不知道

SYN_RCVD,SYN已收到,表示收到SYN信号,也已经给了应答,但是连接还没建立

ESTABLISHED,连接建立,表示双方已经建立了连接,可以开始相互通信了

四次挥手:

处于连接状态的客户端和服务器都可以发出关闭连接的请求,此时需要四次挥手来进行连接关闭。1.假设客户端主动发起连接关闭的请求,它需要向服务器发一个Fin包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手;

2.服务器收到Fin包,发送一个ack包确认,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手;

3.服务器此时还同时会发送未发送的数据,而客户端还可以接受数据,待服务器发送完数据后,再发送一个Fin包,以表示进入最后确认状态,这是第三次挥手;

4,客户端收到后回复Ack包,进入超时等待状态,经过超时时间后关闭连接,而服务器收到Ack包后立即关闭连接。这是第四次挥手。

其中的超时等待状态会持续2MSL(最长报文段寿命)时间,是客户端为了保证自己发送的Ack包确定是发到了服务器手中,然后等待服务器反馈Fin包最终确认数据传输完成才可以正式关闭连接而采取的一种可靠的机制设置。这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态。

经过最后一次挥手后,客户端和服务器的连接才可说是彻底分离。具体见下图:

 FIN :连接终止位;seq:发送的第一个字节的序号;ACK:确认报文段;ack:确认号。希望收到的下一个数据的第一个字节的序号刚开始双方都处于ESTABLISHED 状态。

三、UDP协议

报文头 

上面的source port和destination port分别为UDP包的出发端口和目的地端口。Length为整个UDP包的长度。
  checksum的算法与IP协议的header checksum算法相类似。然而,UDP的checksum所校验的序列包括了整个UDP数据包,以及封装的IP头部的一些信息(主要为出发地IP和目的地IP)。这样,checksum就可以校验IP:端口的正确性了。在IPv4中,checksum可以为0,意味着不使用checksum。IPv6要求必须进行checksum校验。 

UDP和ARP之间的交互式用途:
  这是不常被人注意到的一个细节,这是针对一些系统地实现来说的。当ARP缓存还是空的时候。UDP在被发送之前一定要发送一个ARP请求来获得目的主机的MAC地址,如果这个UDP的数据包足够大,大到IP层一定要对其进行分片的时候,想象中,该UDP数据包的第一个分片会发出一个ARP查询请求,所有的分片都辉等到这个查询完成以后再发送。事实上是这样吗?
  结果是,某些系统会让每一个分片都发送一个ARP查询,所有的分片都在等待,但是接受到第一个回应的时候,主机却只发送了最后一个数据片而抛弃了其他,这实在是让人匪夷所思。这样,因为分片的数据不能被及时组装,接受主机将会在一段时间内将永远无法组装的IP数据包抛弃,并且发送组装超时的ICMP报文(其实很多系统不产生这个差错),以保证接受主机自己的接收端缓存不被那些永远得不到组装的分片充满。

UDP总的特点:
  a)是无连接的。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。
  b)是尽最大努力交付的。也就是说UDP协议无法保证数据能够准确的交付到目的主机。也不需要对接收到的UDP报文进行确认。
  c)是面向报文的。也就是说UDP协议将应用层传输下来的数据封装在一个UDP包中,不进行拆分或合并。因此,运输层在收到对方的UDP包后,会去掉首部后,将数据原封不动的交给应用进程。
  d)没有拥塞控制。因此UDP协议的发送速率不送网络的拥塞度影响。
  e)UDP支持一对一、一对多、多对一和多对多的交互通信。

注:TCP和UDP是两种通信协议,在网络协议层次中这俩同属于传输层,不过它俩却使用了不同的通信方式。

TCP的通信方式就像打电话,一定要确认打通了才开始交流,打不通也会有专门的人告你怎么怎么不通;电话打着打着,欸有一句没听清,可以让对面再说一次;对面挂电话自己也能知道,哦对面挂了,那我也挂了吧,欸不行,我还有事没交代清,那再打回去。

UDP的通信方式就像飞鸽传书,反正我鸽子是放出去了,对面收没收到那我就不管了,要是一段时间内对面没回信,那就当对面没收到吧,到时候就再想想怎么搞,反正我鸽子多的是。

四、IP地址协议

IP地址格式
IP地址由四段组成,每个字段是一个字节,即4个字节、 每个字节有8位,最大值是255(=256:0~255)。

全世界范围是唯一的 32 位(4个字节 * 8位)的标识符。

IP地址由两部分组成,即网络地址和主机地址,二者是主从关系:

网络号 net-id,它标志主机(或路由器)所连接到的网络,网络地址表示其属于互联网的哪一个网络

主机号 host-id,它标志该主机(或路由器),主机地址表示其属于该网络中的哪一台主机。

两级的 IP 地址可以记为: IP 地址 := { <网络号>, <主机号>}

简而言之就是:IP地址 = 网络号+主机号

IP地址分类
IP地址,一共分成了5类,范围分别如下:

A 类 IP:从0.0.0.0 – 127.255.255.255,共有16777216个IP

B 类 IP:从128.0.0.0 – 191.255.255.255,共有65536个IP

C 类 IP:从192.0.0.0 – 223.255.255.255,共有256个IP

D 类 IP:从224.0.0.0 – 239.255.255.255

E 类 IP:从240.0.0.0 – 255.255.255.255

回环IP地址
127.x.x.x 有的资料说,它属于A类。如127.0.0.1 等效于localhost或本机IP。 一般用于测试使用。例如:ping 127.0.0.1来测试本机TCP/IP是否正常。http://127.0.0.1:80,等价于 http://localhost:80

私有IP地址
我们企业或家庭内部组建局域网用的IP,一般都会用私有IP。私有地址(Private address,也可称为专网地址)属于非注册地址,专门为组织机构内部使用,它是局域网范畴内的,私有IP禁止出现在Internet中,也就是不能直接上网。如果在企业内部的电脑要访问Internet,则需要在企业边界上用“NAT技术”将私网IP转成公网IP才能正常的上网。

A类私有IP地址:
    10.0.0.0~10.255.255.255

B类私有IP地址:
    172.16.0.0~172.31.255.255

C类私有IP地址:
    192.168.0.0~192.168.255.255

注:公式
网络数=2^可变的网络ID位数
主机数=2^主机ID的位数-2
网络ID=IP与子网掩码netmask
CIDR表示法,可以表示网络的ID的位数,IP/网络ID的位数
netmask子网掩码: 可以表示网络ID的位数,32bit二进制,对应于网络ID的位为1,对应于主机ID的位为0 
划分子网:网络ID向主机借位,如果借N位,则划分2^N个子网。N为掩码位数,掩码位数 = 网络位 - 默认网络位 = 26 - 24 = 2。

五、路由协议

1.路由协议的特征

在互联网中,不管是局域网还是广域网,一个数据包是可以通过合理的路由控制从一个终端传输到另一个终端的。而起到控制这个数据包发送过程就是路由控制模块,路由控制模块遵循路由协议,路由协议是整个互联网的数据路由的规范和标准。

我们通常会把路由器分为静态路由和动态路由两种,不管是静态路由还是动态路由,都不会脱离路由表。如果数据发送前你已经把路由规则设置好,在发送时数据会按照你事先设置好的路径进行转发的话,这就是静态路由,如果你事先没有设置路由规则,只是让数据在发送的过程中按照路由协议的既定规则进行转发的话,这就是动态路由,这两种路由方式各有利弊。

静态路由会让你做大量且重复的设置路由的工作,效率低而且任务量很大,并且扩展性比较差,一旦新增一个路由,就会让你把所有的路由重新设置一遍,甚至还有单点问题,当传输节点中某一个路由出现故障时,数据基本不会饶过这个路由,需要管理员把路由重新设置才能继续发送。

路由器之间会在合适的时间交换路由表,通过这种方式,可以让网络之间所有的路由器都能够动态调整数据的转发路径。

2.路由协议的分类

路由协议主要分为RIP、OSPF、BGP三种。

其中RIP是根据网络路由的距离长短来选择路径,它只会选择最近都路径,也就是通过的路由器数量越少越好,而不会辨别网络带宽,如果它选择的最短距离是低速带宽,那网络传输速度将会大大延迟,严重影响企业效率,所以现在一般很少使用了。

但OSPF则完全不同,它会自动根据网络带宽估算出最合适的路由路径,以达到最快的网络传输速度,所以现在企业当中默认会选择采用OSPF协议。

而BGP是边界网关协议,它的路径选择构架更加复杂,一般只是大型互联网中使用。BGP交换的网络可达性信息提供了足够的信息来检测路由回路并根据性能优先和策略约束对路由进行决策。特别地,BGP交换包含全部AS path的网络可达性信息,按照配置信息执行路由策略。

注:如果网络跟本主机直连,则无需配置网关。如若网络不直连,则路由器网关就是邻近路由器的IP。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到