【006】Linux网络编程-2 基本概念

TCP层的基本概念

内容提要:

1.TCP的特点

1.1 基于字节流

TCP层传输的数据我们称为segment,他们的边界不做任何的假定;

认为数据是无格式的;意味着可能发送一个数据包可能一次或者多次才能发送成功;

相应的对等方可能需要一次或者多次才能够接受成功一个数据包;

已存在可能接受一次就可能接收到多个segment;

因为传输的时候没有进行边界的控制,则TCP可能会存在粘包问题;

只有在应用层来处理粘包的问题;后面会在编程的时候解决该问题;

1.2 面向连接

 TCP在传输数据之前必须先建立连接才可以传输数据;

1.3 可靠传输

 TCP可以保证在数据传输的时候是可靠的;

会提供一个端到端的校验和保证数据不会出现差错;

该校验机制也并非是完备的;即出错的话校验和一定不对,校验和正确则数据的传输不一定是对的;

与IP层的校验机制是一样的,都是通过“网际校验机制”进行校验的;

可以保证接收到的数据包不会丢失,也不会重复;

1.4 缓冲传输

拿到数据之后并非直接传输段,而是需要提前将数据缓存到缓存区之后选择最佳的时机才会传输;

1.5 全双工

双向同时发送数据;在发送的时候也可以传输数据;

1.6 流量控制

通过“滑动”窗口的算法控制流量;

2.TCP报文格式

【说明】TCP的报文是通过承载在IP的报文中才传输的;

 

【说明】源IP地址和源端口号加在一起作为源端;目的IP地址和目的端口号加在一起作为目的端;

源端+目的端构成了一个TCP的连接;

意味着一个TCP的连接需要四个要素构成:①源IP地址②源端口号③目的IP地址④目的端口号

 

【说明】紧急的数据也称为带外数据;

 TCP传输的PACKTE大小不会超过536,他不能超过MTU的大小;一般取值是512;不然IP层就会出现分片的问题;

 

3.连接建立三次握手

三次握手实例:张三通知李四存100元到张三的账户上;

第1步:张三发一条信息给李四通知李四汇100元到张三的账户上来;

第2步:李四汇款100元后会发送一条信息通知张三已经汇款;

(此时并不保证张三确实已经收到款项,需要张三的回应)

第3步:张三在收到李四给信息后给很自然的给张三回一条信息:“我已经收到”!;

 (李四只有在张三回复后才会放心张三已收到款项)

一般生活中的通信的过程都是遵循三次握手的机制的;

TCPA首先发送的数据:序列号为“a”,并且SYN置为“1”;

 

 TCPB发送的数据:期望下一次收到的序列号好为b;

4.连接终止四次挥手

【说明】

【1】发起终止的可以TCPA也可以TCPB,双方都可以首先关闭套接字;

【2】实际上不管谁先发起终止,都是一共发生了两次“close” 关闭套接字,只是关闭的顺序不一样;

【3】其实双发发出的信号是一样的,只是序号和先后顺序不一样;

实质就是依次发出close,然后对方进行回应;

5.TCP如何保证可靠性

 【问】不可靠表现方式有什么?

①数据出现差错②数据存在丢包③数据的顺序有误④收到的数据重复

序号 不可靠表现 对应的解决方式
数据出现差错 校验和
数据存在丢包

通过超时重传机制,并且还需要使用确认机制

只有在规定的时间内没有收到对方的消息则认为是超时;

数据的顺序有误 在数据头部都有序号标识,可以根据序号进行重新排序
收到的数据重复 与③一样的,通过序号重复可以保证数据不重复

 

 

 

 

 

 

 

 

6.滑动窗口协议【重点】

【说明】主要适用于流量控制;

即可以应用于“链路层 ”,也可以应用于“传输层”;

两者之间的不同:链路层使用帧为单位进行确认的,传输层使用字节为单位进行确认的;

流量控制很关键的地方在于“窗口的维护”;

发送端维护了一个“发送窗口”,接收端维护了一个“接收窗口”;

发送端发送的数据大小不能超出“接收窗口”的缓存区的大小,否则会导致数据的丢失;

【问】在数据发送的时候无法知道“接收窗口”的大小,因此无法设置“发送窗口”的大小,该如何解决该问题?

【答】TCP有个头部字段,其中定义了“窗口的大小”,是一个16位的整数;

在TCP建立连接的时候双方都会通告双方建立窗口的大小,通道窗口大小,用来通知双方各自的通道窗口大小; 

除此之外,还通知了TCP的各自的段的MSS的大小;

MSS和窗口大小没有必然的关系;

MSS主要是防止TCP的分片,而窗口主要是用于流控;

MSS的大小必须小于MTU的大小,最好是小于MTU-20(TCP头部大小)-20(IP头部大小);

确定了“接收窗口”的大小,基本上就可以确定了“发送窗口的大小”,一般两者相等;

 但是在协议中,TCP协议的“”发送窗口的大小“并不一定等于“接收窗口的大小”;

【问】滑动窗口是如何工作的?

首先应用层要生成数据放到“发送窗口”中,相当于放到缓存区;

如果数据大小超过了“窗口”的缓存区大小,应用层将会阻塞,必然等待腾出更多的空间直到发送;

会导致发送速度变慢,如果“发送窗口”设置的太小,就会导致发送速度变慢,必然影响对方的接收速度也变慢;

实际上使用时,发送窗口要和接收窗口的大小匹配才可以,这样才能够达到最佳的性能;

并非“发送窗口”越大越好。

否则就是恶性循环:发送窗口太大-->发送数据量大-->接收窗口太小,数据丢失--->应用层超时重传-->再次发送数据--->效率变慢;

因此,最适合的值才是最好的;

 【累积确认机制】假如接收窗口中4.5.6都到了,是否会直接全部确认呢?

【答】不一定;此时只对6进行确认,同时滑动窗口移动到7-16,

 【滑动窗口的改进1】

  

 【滑动窗口的改进2】

 

 一般会选择“通告接收窗口”和“拥塞窗口”两者的最小值;

【问】拥塞窗口的大小如何知道呢?

拥塞窗口处于动态的变化中,它的大小可能会发生变化;

实际上TCP使用了两个阶段,用来逐渐确定拥塞窗口的大小,来达到一个最佳的值;

.......

查看视频;

7.UDP特点

无连接

不可靠

一般情况下UDP更加高效:UDP的头部比TCP的头部更简单;UDP并没有一些确认机制;

8.UDP报文格式

 

posted @ 2021-09-12 16:30  OzTaking  阅读(74)  评论(0)    收藏  举报