理论 | 三天两夜,万字长文,吃透TCP/IP

500 阅读10分钟

思维导图

计算机体系网络结构分层

概述

物理层

物理层上传送的单位为比特,规定了网络的一些电器特定,主要负责0,1比特流与电子信号之间的转换,如果没有物理层,0,1 构成的比特

流将会无法在物理介质中传播。

链路层

数据链路层,又称作为链路层,单纯的0和1是没有任何意义的,必须规定其解读方式,多少个电信号算一组,每个电信号又有什么意义,这就是数据链路层的作用,数据链路层,规定主要有三个功能,分别是封装成帧、透明传输、差错控制。将会依次解释这三个内容。

封装成帧

在一段数据的前后分别添加首部和尾部,来对帧与帧之间实现一个定界。定界如下

透明传输

由于不管什么数据,所传送的都应该能在链路上传送,因此透明传输会带来一个问题,当数据中的比特组合恰好一致的时候,如果采用不适当的措施,将会造成数据被切分。如下图所示。

这里使用字节填充法实现透明传输的问题,发送端的数据在链路层中出现控制字符SOH或者ETO的时候,在前面添加一个转义字符ESC,如果ESC也出现的话,这里就在ESC之前继续添加一个ESC实现转义,如下所示。

差错控制

在数据传输的过程中,如果出现丢失,或者帧损坏,这里就需要差错控制来进行检测和纠正,这个协议将会在网络层中进行说明。

MAC地址

数据帧准备好了,这里还有一个问题,计算机A和计算机B之间数据相互发送,但是谁传给谁,如何区分,这里MAC地址便出现了。MAC地址,连人网络的每一个计算机都会有网卡接口,每一个网卡都会有一个唯一的地址,这个地址称作为MAC地址,计算机网络之间相互传送的时候,都会使用MAC地址进行相互的传送。

网络层

网络层的主要功能负责不同网络之间转发数据,实现这个功能的,为路由器。

如果你在杭州的计算机A要给纽约的计算机B通信,这里就会使用广播方式发送数据包,然后对比MAC地址,相同的接收,不同的丢弃,很明显,这样相当的不和你,所以在网络层中,划分了子网,协议规定,假如是在同一个子网,就会使用广播的形式把数据发送给对方,如果不是在同一个子网,将会发送给网关,然后进行转发。

传输层

通过网络层,A已经发送到了B,在这里就有了传输层,传输层的主要作用,为互相通信的应用进程,提供数据传输服务,当计算机A与计算机B通信时,在传输层上,还需要指定一个端口,来给特定的应用程序,即,传输层功能是建立端口到端口的通信,相比网络层的功能是建立主机到主机的通信。

在传输层中,主要使用TCP/UDP协议。

TCP 传输控制协议,在数据传输的时候,会建立会话,同时会把需要传输的文件进行分段,提供可靠传输和流量控制,例如下载视频,当数据较大的时,用的是TCP协议。

UDP 协议,一个数据包就能完成数据通信,也就是说不需要建立会话,不需要流量控制,同时也是不可靠传输,例如DNS域名解析,屏幕广播,这里使用的就是UDP协议。

应用层

当数据传输到了传输层的数据之后,接下来需要解读,因为互联网开放式的,应用层作用规定应用的数据格式,例如TCP协议可以传输Email,WWW,FTP等,这些协议的数据格式。例如域名的DNS,万维网的HTTP协议,电子邮件的SMTP协议等等。这些数据单元称之为报文。

TCP/IP基础

具体含义

TCP/IP这里指的是一些协议群,具体来说,这里指的是IP或者ICMP,TCP,UDP,FTP等,这些协议,以及HTTP等的TCP/IP协议,等等这些协议都统统称之为TCP/IP网际协议群。在互联网进行通信的时候,需要相应的网络协议,TCP/IP原本就是为互联网开发定制的协议,这里互联网协议就是TCP/IP,TCP/IP就是互联网的一些协议。这里协议如下图所示

基本工作原理

TCP/IP模型有四层,分别是应用层,网际层,网络接口层,这四层,每层分别具有不同的功能,TCP/IP协议协议是一组在不同层上的多个协议的组合,每层在实现自身的情况下直接提供服务,同时也为上层提供服务其图示如下

进行封装和拆解的过程如下图

在这里,将会加入相关的数据报,以及相关的数据信息,达到传送数据的目的。

数据包

在这里,指的是TCP/IP协议数据通信中的数据单位,即,数据包, 即,从最上层,一层层的封装,直到网络层,最后借由数据链路层发送的数据单元。即。数据包为一个完整的数据单元,如果超过了MTU,这个时候,会和多个帧组合在一起,然后形成一个完整的数据包。

数据包的分层如下

在网络传输中,数据包由两个部分组成,一个是协议所需要用的首部,另一部分是上一层传过啦的数据,首部的结构由协议的具体规范进行定义,在数据包的首部,明确标明了协议应该如何读取数据,即,看到首部,就能明确的直到该协议所需要的信息和所需要处理的数据。

传输中和TCP和UDP

端口

端口,英语为port,称之为连接端口,端口,协议端口, 位于传输层的通信协议通常需要指定端口号,例如在TCP/IP协议族之下的TCP与UDP协议。在应用层中,使用主从式架构的通信协议,在每个端口上提供多路复用服务(multiplexing service)。经由公认端口号(well-known port numbers),通常可以辨认出这个连线使用的通信协议,其中具代表性的是最基础的1024个公认端口号(well-known port numbers),例如Telnet协议默认使用23端口来连线,Secure Shell协议默认使用22端口,HTTP协议默认使用80端口,HTTPS协议默认使用443端口。

源端口号

源端口号一般是由系统自己动态生成的一个从1024-65535的号码,当一台计算机A通过网络访问计算机B时,如果它需要对方返回数据的话,它也会随机创建一个大于1023的端口,告诉B返回数据时把数据送到自己的哪个端口,然后软件开始侦听这个端口,等待数据返回。而B收到数据后会读取数据包的源端口号和目的端口号,然后记录下来,当软件创建了要返回的数据后就把原来数据包中的原端口号作为目的端口号,而把自己的端口号作为原端口号,也就是说把收到的数据包中的原和目的反过来,然后再送回A,A再重复这个过程如此反复直到数据传输完成。当数据全部传输完A就把源端口释放出来,所以同一个软件每次传输数据时不一定是同一个源端口号。

UDP

UDP全称为用户数据报协议,是一个简单的面向数据报的通信协议,位于OSI模型的传输层,UDP为不可靠传输,

具有以下几个特点

  1. 面向无连接 UDP不需要和TCP一样在数据发送前进行三次握手进行连接,只是数据的搬运工,不会对数据进行相关的处理。具体来说, 在发送端,应用层把数据传输为UDP协议,UDP只会给数据增加一个UDP头标识标识是UDP协议。在接收端,网络层把数据传送给传输层,不会做任何的拼接操作。

功能点

具有单播,多播,广播等功能。

面向报文

UDP是面向报文的,既不合并,也不拆分,因此应用程序需要选择合适的报文,进行发送。

不可靠性

UDP回发生数据的丢失,由于没有相关的数据的确认过程。

传输效率高

由于头部开销小,传输数据的时候报文效率相当的高。

TCP

当一台计算机与另一台计算机通信的时候,两台计算机需要通信畅通,并且可靠,这样才能保证收发数据,所以就有了一个三次握手,四次挥手,实现数据的连接。

三次握手

  1. 第一次握手(SYN=1, seq=x):

客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

发送完毕后,客户端进入 SYN_SEND 状态。

  1. 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。发送完毕后,服务器端进入 SYN_RCVD 状态。

  1. 第三次握手(ACK=1,ACKnum=y+1)

客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

四次挥手

  1. 第一次挥手(FIN=1,seq=x)

假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

发送完毕后,客户端进入 FIN_WAIT_1 状态。

  1. 第二次挥手(ACK=1,ACKnum=x+1)

服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

  1. 第三次挥手(FIN=1,seq=y)

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

  1. 第四次挥手(ACK=1,ACKnum=y+1)

客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

零基础学习Java,可以加入我的Java学习园地