【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报文格式

浙公网安备 33010602011771号