TCP/IP 入门

tcp/ip是一个协议簇,而不仅仅是指tcp和IP协议,这里我们主要说一下传输层中的TCP协议

1:tcp、ip七层,四层模型

TCP/IP 入门_第1张图片

为什么会有七层和四层模型,而为什么又要设计出这么多层呢?

网络数据在从发送到最后的接收端,中间牵扯到的过程非常的繁琐,为了保证数据能够到达目的地,又要保证系统处理数据不会过于复杂,所以采用了一种分而治之的思想,每一层只负责一部分功能,下层为上层提供服务,这样每层各司其职,既不会让实现过于复杂,又能保证数据的传输。

实际上刚开始的时候,七层模型是由ISO(国际标准化组织)提出来的,七层模型的提出很好,但是在实际运用的过程中,显得过于繁琐,而四层模型更加的实用,所以平时我们所接触的也都是四层模型。


3:网络传输中遇到的问题(TCP协议出现)

 下层为上层提供服务,每一层各司其职,那他们每一层都做了什么,我们在这里只说网络层及其以上的层。

网络层负责寻址,保证数据被投递到目的地。

当数据到达后,数据如何传输,如何交互,数据是否有误,是否可靠,则由传输层来做保证。

传输层又分为TCP和UDP,TCP是一种面向连接的协议(类比索道,数据的传输依靠索道,因为有索道的存在,所以数据,在传输过程中不会出现丢失的现象),能够保证数据的可靠传输,具体如何做的我们下面会讲到。

TCP/IP 入门_第2张图片

UDP则是一种面向无连接的形式(类比 抛球, 数据传输的过程不存在有效的保证),所以他不能保证数据不会丢失,



TCP/IP 入门_第3张图片


应用层 当数据到达我们的应用程序,需要我们的应用处理的时候,应用需要处理,连接的建立与关闭、数据的编解码、数据的处理,这一层也是我们在编写应用时主要的工作。

4 TCP如何保证数据的可靠性传输

4.1 TCP 三次握手

三次握手是连接建立的一种保障,他保证了通信双方都是没有问题的。

TCP/IP 入门_第4张图片

为什么要三次握手,因为只有通过三次握手才能确定通信双方的收发是没有问题的,可以想象两个人的对话,A 向 B 说了句,“今天天气不错啊”,如果B不回复,则说明B有可能没听见,如果B回复:“是啊”,则代表B可以听得到,说明B的收消息功能是没有问题的。当A收到B的回复时,说明 A的收和发消息功能都是没问题的,但是B自己不能确定自己的发消息是没有问题的,所以此时A又回复了一个SYN。


为什么是三次,而不是两次和四层

其实,在包的发送过程中,如果只有两次,一旦有请求到达服务端,服务端就认为这次请求是有效的,然后建立连接,此时就会造成服务器资源的浪费,因为在数据的传输过程中,因为某些原因导致某些数据包被延迟,最后连接断开之后,该数据包到达了服务器,如果没有三次握手,而是两次,服务器就会为这个无效的数据包建立连接,最后导致资源的浪费。官方解释:防止失效的连接请求报文段突然又传送到主机。


三次握手建立连接后,如何保证数据的可靠性(确认应答)

TCP/IP 入门_第5张图片


在每发送一次数据的时候,服务端,都会给一个确认应答(ACK),如果因为某些原因,发送的数据丢失了,则可以要求其重发,如果发送方没有收到ACK,发送方也会重新发送(这里面牵扯到一个时间间隔,多长时间收不到ACK回复,需要重发,这其中会根据网络的情况做一个计算,然后确定时间间隔,这里不展开)


那么如何保证,发送的数据是有序的呢,这就要 序列号出场了, 发送方,没法送一次数据,都会携带一个序列号,当接收方收到这个序列号后,会给发送方一个下次需要发送的起始序列号,发送方根据这个序列号再次发送下一批数据。

TCP/IP 入门_第6张图片

如此一来就保证了数据的有序性


5 如何保证TCP的高效传输

确认应答和序列号保证了数据的可靠有序的传输,但是,每一个数据包都要求其ACK,如果包的往返时间越长,那么通信的性能就越低。

于是,引出来滑动窗口的概念。

滑动窗口的作用是,通信双方定义一个窗口个数,以及每一个窗口允许发送的最大消息长度(MSS),消息的发送都是以MSS为单位进行发送的,然后以整个窗口的数据量进行发送。例如我们定义一个4窗口,每个窗口的MSS为1000的标准,那么在发送的时候,其过程如下图:


TCP/IP 入门_第7张图片


即使在回复ACK的时候,因为某个ACK丢失,只要最后一个ACK没有丢失,都可以确定包的传输是没有问题的,同时也提高了数据的传输效率。

在以前的确认应答中,我们通过“时间间隔”来判断包是否需要重发,而在滑动窗口中,我们可以更快的确认,包是否需要重发,例如,当发送方在发送第1001到2000这一段数据后,接收方没有收到数据,因为发送方不需要每一个数据发送后都需要等待ACK,所以他会把剩余窗口中的数据全部发出去,但是接收方,因为没有接收到1001-2000这一段的数据,所以返回的ACK中一直是ACK(10001),当三次ACK的数据相同时,发送方会重新发送丢失的数据包。相比以前的“时间间隔”判断,滑动窗口则会更及时处理丢包的情况。

滑动窗口同时也提供了流控制,TCP三次握手,以及在数据传输的过程中,除了确认下次发送的序列号之外,还有每次发送数据段的大小(MSS),发送发和接收方都给出一个MSS,然后选择其中最小的一个作为传输的最小单位。在数据传输的过程中,也会调整其大小。


6 TCP的拥塞控制

因为TCP的滑动窗口,所以,数据段的传输效率被提高,但是如果在通信刚开始的时候就发送大量的数据,就有可能产生问题。因为计算机网络都处在一个共享的环境中,因为其他主机的原因已经导致网络拥堵,此时如果再发送大量数据,就有可能到正网络瘫痪。

所以TCP的启动过程是一个慢启动的过程。

在刚开始启动的时候,设置拥塞窗口的大小为1,当收到确认应答的时候,拥塞窗口的大小成倍的增加,网络传输的速度开始逐渐提高,但是随着网络拥堵的发生,吞吐量也会极速下降。于是再次进入吞吐量慢慢上升的过程



你可能感兴趣的:(tcp/ip)