网络原理TCP/IP

 

目录

 

一.TCP/IP五层模型

二.应用层

1.自定义应用层协议

典型的用来组织数据的格式:

1.XML

2.json

三.传输层

传输层重点协议

1.UDP

2.TCP

TCP协议格式

TCP内部的工作机制

1.确认应答

2.超时重传

3.连接管理

三次握手

四次挥手

​编辑​编辑

4.滑动窗口

5.流量控制

6.拥塞控制

7.延时应答

8.捎带应答

9.面向字节流

10.异常情况

3.UDP和TCP的对比

四.网络层

IP协议

 IP协议--地址管理

IP地址的利用方法

1.动态分配IP地址

2.NAT网络地址转换

3.IPv6

IP协议--路由选择

五.数据链路层


一.TCP/IP五层模型

协议栈:OSI七层模型

              TCP/IP五层模型

网络数据传输的基本流程:

封装:发送方,把数据从上到下层层加上协议报头(包装快递)

分用:接收方,把数据从下层到上层进行解析(拆快递)

二.应用层

1.自定义应用层协议

当前软件(应用程序)要解决的业务场景是错综复杂的。不同的公司有不同的业务,不同的业务有不同的流程。使用程序来解决复杂的业务也就复杂了。因此很难有一个通用的协议来满足所有的业务需求,所以需要自定义协议。

怎样进行自定义协议

1.结合需求,分析清楚,请求响应(客户端/服务器之间)要传递哪些信息。

2.明确传递的信息以什么样的格式来组织

最简单的方式--文本

典型的用来组织数据的格式:

1.XML

标签化的数据组织方式

(使用标签来表示键值对,以及树形结构)

包括开始标签和结束标签,需要成对出现,标签中间的部分就是标签的内容

内容可以是数字,可以是字符串,也可以是嵌套放别的标签

XML中标签的名字、内容都是自定义的

2.json

随着时间发展大家觉得xml比较啰嗦,开始使用json

上述xml和json都是按照文本的方式来组织的

优点:可读性好,用户不需要借助其他工具,肉眼就能看懂数据的含义

缺点:效率不高,尤其是占用了较多的网络带宽

xml中要额外传很多标签,json中要额外传送很多的key

对于服务器来说,最贵的是硬件资源,不是CPU更不是内存,而是网络带宽

3.protobuffer(谷歌)

二进制的表示数据的方式,针对上述数据信息,通过二进制的方式进行压缩。特点(二进制,用记事本打开乱码)但是占用的空间小了,传输的带宽也就降低了。

综上,一个复杂的工作,如何使用一个协议来完成所有工作,这个协议会十分复杂。

协议拆分:大的协议变成多个小的协议,每个协议负责一部分工作。

协议分层:为了让协议之间更好的配合,约定上层协议调用下层协议,下层协议给上层协议提供服务(协议之间不能跨层交互)

三.传输层

传输层操作系统内核已经实现好了,但是程序员写代码要调用系统提供的socke api完成网络编程的。socket就是属于传输层的部分。传输层涉及到的两个协议(UDP和TCP)

端口号:属于传输层协议的概念。在同一个主机上,一个端口号不能同时被多个进程绑定。

UDP和TCP协议报头中都会包含源端口和目的端口。(都是使用两个字节,16个bit位表示的,一个端口号的取值范围  0~65535)。自己写程序,绑定的端口从1024起。0~1023这个范围的端口称为”知名端口号“,这些端口号属于已经分配给了一些知名的广泛使用的应用程序了。

传输层重点协议

1.UDP

UDP特点:无连接 不可靠 面向数据报 全双工

UDP报文长度,也是两个字节表示的。2个字节表示的范围0~65535,换算单位64kb,一个UDP数据报,最大只能传输64kb的数据。

超过64kb,两种解决方式:

1.在应用层通过代码方式针对应用层数据报进行手动分包,拆成多个UDP数据报进行传输(麻烦)

2.不用UDP,使用TCP

校验和:作用是验证传输的数据是否正确。网络传输的过程中,可能会受到一些干扰,会使数据传输出现差错。

如果发送方和接收方的内容一致,按照同样的算法得到的校验和是一致的。如果根据前后内容计算的校验和不一样,则说明传输过程出现了差错。

几种常见的校验和算法:

1.CRC    2.MD5   3.SHA1

2.TCP

TCP协议格式

TCP是更重要的协议,相比于UDP复杂不少

特点:有连接、可靠传输、面向字节流、全双工

注意:首部长度是4bit位

4bit=>0~15   首部长度的单位不是字节,而是4字节。

如果首部长度是5,表示整个TCP报头是20字节,相当于没有选项。

如果首部长度是15,表示整个TCP报头是60字节(选项相当于是40字节)

保留6位:比特位现在还没有用,但以后可能会用上,所以在这里先占位置,让别人先不要用。

留保留位的原因:对于网络协议来说,扩展升级是一件成本很高的事情。如果后续TCP引入一些新的功能,就可以使用这些保留位字段。此时对于TCP本来的报头结构影响比较小。

TCP内部的工作机制
1.确认应答

实现可靠传输的最核心机制。

A给B发了一个消息,B收到后就会返回一个应答报文(ack),此时A收到应答之后就知道了刚才发的数据已经顺利到达B了。

注意:网络“后发先至”这个现象是客观存在的,无法避免。因此应答报文到达的顺序也是可能发生变动的,此时就需要考虑如何规避这种顺序错乱带来的歧义。

解决后发先至的方法:

给传输的数据和应答报文都进行编号。这样即使顺序乱了也可以根据序号确认应答报文是针对哪个数据进行的了。

确定一条报文是否是应答报文,取决于ack这个标志位是否为1,如果为0则不是应答报文。

TCP的序号是面向字节流的,TCP的序号也是按照字节来编号的。(发的数据报有N个字节,但是只需要把这些字节的第一个标号为一个序号)TCP的序号是依次累加的,依次累加的过程对于后一条数据报来说,起始字节的序号就是上一个数据的最后一个字节的序号。每个TCP数据报报头填写的序号只需要填写TCP数据的头一个字节的序号即可。

TCP知道了头一个字节的序号,再根据TCP报文长度,就很容易直到每个字节的序号。

表示的含义:

1.<1000的数据都已经确认接收到了

2.A接下来应该从1001这个序号开始继续发送

小结:TCP可靠传输能力,最主要就是通过确认机制来保证的,通过应答报文就可以让发送方清楚的知道是否传输成功,进一步的引入了序号和确认序号,针对多组数据进行详细区分。

2.超时重传

丢包涉及到两种情况:发的数据丢了、返回的ack丢了(发送方看见的结果就是没有收到ack,区分不了是哪种情况)

因此TCP就引入了重传机制,在丢包的时候,就要重新再发一次同样的数据。

TCP直接引入了一个时间阈值,发送方发了一个数据之后,就会等待ack,此时开始计时,如果在时间阈值之内也没有收到ack,这时不管ack还在路上还是彻底丢了,都视为是丢包了。

重复传输对扣款等操作而言会造成严重的影响,TCP对于这种重复数据的传输,有特殊处理---->去重

TCP存在一个“接收缓冲区",想象成一个阻塞队列,根据数据序号,非常容易识别到当前接收缓冲区的两条数据是否是重复的,如果重复就把后面的数据直接丢弃,保证了应用程序调用的read读取到的数据一定是不重复的。

由于去重和重新排序机制的存在,即使重复传输,接收方也能处理好数据。

小结:TCP的可靠传输就是通过确认应答+超时传输来进行体现的。其中确认应答描述的是传输顺利的情况,超时传输描述的是传输出现问题的情况。这两者相互配合,共同支撑整体的TCP可靠性。

3.连接管理

连接(connection):

通信双方要各自记录对方信息,彼此之间要相互认同。

管理:就是描述了连接如何创建如何断开。

TCP的建立连接过程(三次握手)断开连接的过程(四次挥手)

三次握手

通信双方要各自向对方发送一个”建立连接“的请求。同时再各自向对方回应一个ack。这里其实一共有四次信息交互。但是中间两次交互是可以合并成一次交互的。因此就构成了三次握手。

中间两次可以合并在一起节省资源,最后一次不能省略,省略了就不能确定A也是B的唯一,就不能确定双方之间的认同。

三次握手的作用:验证通信双方各自的发送能力和接收能力是否正常。

三次握手的意义:

1.让通信双方各自建立对对方的认同

2.验证通信双方各自的发送能力和接收能力是否ok

3.在握手的过程中,双方协商一些重要的参数

TCP状态:

建立连接阶段主要认识两个状态

1.LISTEN: 服务器的状态,表示服务器已经准备就绪,随时可以有客户端来建立连接。(相当于手机开机,信号良好,随时可以有人来打电话)

2.ESTABLISHED:客户端和服务器都有的状态。连接建立完成,接下来就可以正常通信了(电话拨打过去,对方就接通了)

四次挥手

“挥手”和“握手”一样都是形象的叫法,都是客户端服务器之间的数据交互。

四次挥手,和三次握手非常类似。通信双方各自向对方发起一个断开连接的请求,再各自给对方一个回应。

CLOSE_WAIT:出现在被动断开连接的一方

TIME_WAIT:出现在主动发起断开连接的一方(防止最后一次ack丢包,要给重传操作留下等待时间)

在三次握手和四次挥手的过程中,同样存在超时重传。如果是最后一个ack丢包了,站在服务器的视角来看,服务器不知道是ack丢了还是自己发的fin丢了,统一进行重传操作。

TIME_WAIT具体保持的时间:2MLS(MLS:指的是互联网上两个节点之间数据传输消耗的最大时间)

4.滑动窗口

确认应答,超时重传,连接管理,都是给TCP的可靠性提供支持。引入了可靠性,其实付出了代价,降低了传输效率。

滑动窗口本质上就是降低了确认应答,等待ack消耗的时间。

批量发送了窗口大小的数据后,发送方只需要等到一个ack返回,就可以继续发送下一条数据。

此时丢包解决情况:

1.ack丢失:不用做任何处理,没有关系。

2.数据丢失

当发送方不停的接收到同一个ack,说明反复出现的这个ack所代表的数据没有传输成功,这个时候就需要重传了。

上述的丢包重传的方式,起了个名字叫做“快速重传”(重传操作只重传了丢失的数据)

如果当前传输数据密集,按照滑动窗口的方式来传输,此时按照快速重传处理丢包。

如果当前传输数据稀疏,不再按照滑动窗口的方式了,此时还是按照之前的超时重传处理丢包。

5.流量控制

这是一种干预发送窗口大小的机制。滑动窗口越大,传输效率越高(一份时间,等的ack越多)

但窗口不能无限大:

1.完全不等ack,可靠性无法得到保障

2.窗口太大,也会消耗大量系统资源

3.发送速度太快,接受方处理不过来

接受方的处理能力是一个重要的约束依据。发送方发送的速度不能超出接收方的处理能力。流量控制就是根据接收方的处理能力,协调发送方的发送速率。衡量接收方的处理能力,最简单的方法是查看接受方缓冲区的剩余大小。剩余空间大则可以加快速度,反之亦然。

6.拥塞控制

流量控制和拥塞控制共同决定发送方的窗口大小是多少。(拥塞窗口和流量控制窗口的较小值)

流量控制考虑的是接受方的处理能力。拥塞控制描述的是传输过程中,中间节点的处理能力。

拥塞窗口不是固定的数值,而是一直动态变化的,随着时间的推移,逐渐的达到一个动态平衡的过程,随着网络的动态变化而变化。

7.延时应答

延时:收到数据后,不是立即返回ack,而是稍微等儿再返回。等待的时间里,接收方的应用程序就能把接受缓冲区的数据消费一些,此时缓冲区的剩余空间就会更大。

实际上延时应答采取的方式,就是在滑动窗口下,ack不再每一条数据都返回了,隔一条返回一个ack

8.捎带应答

捎带应答也是提高效率的方式,在延时应答的基础上,引入的捎带应答。

由于延时应答机制,导致等待ack的过程中,B就要给A发送业务数据了,就可以让业务数据捎上这个ack一起发送过去就行了。

注意:三次握手是一定合并,此处是有一定概率合并,这里和四次挥手的合并更像。

9.面向字节流

面向字节流,引入了一个麻烦事,粘包问题。

接收缓冲区,其实是把收到的多个数据放在一起的。应用程序read读取时,由于TCP是字节流,可以一次读一个字节,一次读N个字节,就导致一次读到的数据可能是半个应用层数据报,可能是一个应用层数据报/多个应用层数据报。(就像一篇没有标点符号的文章,怎么断句全凭自己领悟)

解决方案:约定好应用层协议,尤其明确应用层数据报和应用层数据报之间的边界就好了。

1.约定好分隔符

2.约定好每个包的长度

10.异常情况

传输过程中出现了不可抗力:

1.进程奔溃了

进程没了,对应的pcb没了,对应的文件表述符就释放了,相当于socket.close(),此时内核会完成四次挥手,仍然是一个正常断开的流程。

2.主机关机了(按照正常流程关机)

主机关机要先关进程,然后才正式关机(杀死进程的过程也和上面一样触发四次挥手)

3.主机掉电了

来不及挥手。

如果是接收方掉电,发送方等不到ack,即使重传也是一样,尝试重新连接TCP也会失败;如果是发送方掉电,接收方收不到数据,先等待一段时间。接收方会周期性给发送方发送消息(心跳包),确认对方是否正常工作。

4.网线断开了

3.UDP和TCP的对比

TCP优势在于可靠传输,绝大部分情况下,都需要可靠传输。

UDP优势在于可以保证更高的效率。如果有些场景对于性能要求更苛刻,此时考虑UDP。(同一个机房内部的,服务器之间的通信。网络结构相对简单,网络带宽比较充裕,转发设备也是比较好的设备,整体丢包的可能性比较小)

UDP还有一个优势,支持广播。提供UDP往广播IP上发送数据报,此时该局域网上的所有设备都能收到数据。

TCP和UDP是两个极端,TCP极大程度上保障了可靠性,UDP极大程度上保障了高效性,实际应用场景中(比如大型游戏,需要同时保证可靠性和高效性,这个时候就需要使用介于两者之间的一些其他协议)

四.网络层

1.地址管理

2.路由选择

网络层的代表:

IP协议

 IP协议--地址管理

子网掩码表示哪个部分是网络号

IP地址的利用方法

32位只能表示42亿九千万个数字。为了解决IP地址不够用的问题,有以下方法:

1.动态分配IP地址

(上线使用的分配IP,本质上没有增加IP,只是提高了原有IP的利用率)

2.NAT网络地址转换

使用一个IP代表一批设备(用不同端口号内部区分)

NAT把IP地址分为两个大类:

1.内网IP(私有IP):  10.*     172.16.*-172.31.*    192.168.*

2.外网IP(公网IP):   除了内网IP,其余都是

公网IP是唯一的,私网IP可以在不同的局域网中重复出现。私网设备可以通过NAT设备访问公网,公网设备无法直接访问私网设备,不同局域网的私网设备也无法互相直接访问。

虽然NAT能解决IP地址不够用的问题,但也会让网络环境更加复杂(比如说同一个局域网下,不同设备之间发送消息)

3.IPv6

从根本上解决IP地址不够用的问题

使用16字节表示IP地址(IPv4是4字节),相当于可以表示的IP地址有42亿的四次方。

虽然IPv6表示的IP地址范围很大,但当今任然是按照NAT+IPv4来构建网络的,真正使用IPv6的地方非常少,IPv6比较贵,但在我国,国家号召后已经有很高的IPv6覆盖面,目前各种程序,运营商,网络设备都支持了IPv6。(防止某些国家的网络制裁)

IP协议--路由选择

数据报寻路的过程,路由器一边走,一边访问相邻网络的过程。、

五.数据链路层

考虑两个节点之间的传输(通过网线、光纤、无线直接连接的两个设备)

这里最出名的协议“以太网”。

MTU:一个数据链路层的数据帧,代表能够承载数据的最大长度(载荷长度)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Roylelele

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值