TCP/UDP的概念
TCP和UDP协议是TCP/IP 协议的核心
TCP:传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。由IETF的RFC 793定义。
UDP:用户数据报协议(User Datagram Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。由IETF的RFC 793定义。
TCP与UDP的区别
1,TCP是面向链接的协议,而UDP是无连接的协议;
2,TCP协议的传输是可靠的,而UDP协议的传输“尽力而为”;
3,TCP协议可以实现流控,而UDP不行;
4,TCP可以分段,而UDP不行;
5,TCP消耗资源较大,传输效率较低;UDP耗费资源较小,速度快。
面向连接 --- 在正式传输数据之前,先适用预先的协议,建立点到点的链接。
TCP建立的连接实际建立了一个双向的会话连接,即通讯双方都可以向对方发送数据
可靠 --- 确认,重传,排序,流控
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复且按序到达。 UDP尽最大努力交付,即不保证可靠交付。
流控 --- 滑动窗口机制(窗口不是数据包,也是按照字节数来计算)
实现流控的过程(有升有降,试探极限):假如A一次性发送3个数据包,B收到后回一个ACK=1,ACKN=4,Win=3(B能够接受的窗口值),A为了提高效率,会把发送给B的窗口值调大,等B的回复,若B能够处理,则回复Win=调大后的数值,A再次向上调大,以此类推;若B不能处理,则回复Win=B能接受的数值。所以处理流量不会是一个固定值,而是会一直处于一个试探方式。
TCP和UDP的使用场景
TCP协议更适用于对可靠性要求较高,但是对传输效率和资源占用要求较低的场景;UDP更适用于对传输效率要求较高,可靠性要求较低的场景(即时类通讯)。
封装与解封装图![](https://i-blog.csdnimg.cn/blog_migrate/725696cd94fabab1bec4045edf68af42.png)
TCP的头部(TCP与UDP只有头部需要加参数)
序号(32位):在数据传输的过程中确保数据的顺序,标识数据段的数据。
确认序号(32):当A向B发送请求序号后,B表示收到并让A继续发送下一个序号(可以回一个相同序号的同时,再回下一个序号;也可以直接回下一个序号)
选项:在首部可有内容,也可以无内容。 --- 有了可选项,TCP协议的长度就不是固定的。
首部长度:TCP的头部又叫可变长头部,所以首部长度对区分其头部很重要
标记位:保留后的六格代表一位二进制(0/1),标记位致0表示该标记未被激活,标记位置1表示该标记已被激活
URG : 紧急标记位(占1位)。此标记位置1代表有此数据包当中有紧急处理的内容,与此同时紧急指针会激活。这段紧急需要处理的内容会放在数据的最前端,而紧急指针则在此处标记需要紧急处理的这段内容的结尾处,用来让紧急处理数据与普通处理的数据进行分隔。
ACK : 确认标记位(占1位)。此标记位置1代表是我的数据包是一个确认数据包,与此同时确认序号会被激活。
PSH :传送标记位(占1位)。在TCP协议当中,数据分段拆分成多个数据包,当所有数据包过去后,TCP协议会有一个缓存空间,将所有数据包收集起来,按照序号进行排序,将完整的数据包排列好后才会进行传输,而此标记位置1代表数据包不需要在缓存空间中进行排序,而是直接将数据包进行处理。
RST : 强制断开标记位(占1 位)。此标记位置1的数据包,将不经过四次回挥手的过程,直接断开TCP的连接。
SYN :请求标记位(占1位)。此标记为置1代表请求建立连接。
FIN : 结束标记位(占1位)。此标记为置1代表请求断开连接。
窗口大小(16位):窗口值是多少,就相当于一次性发多少个数据包,只须确认一次。
校验和(16位):确保数据完整性(TCP中校验被称为伪头部校验 --- 除了校验传输层头部和数据内容外,还会将网络层头部中的12字节的内容一起进行校验。)
12字节的内容包括:32位源IP地址,32位目标IP地址,8位保留字段,8位协议字段,16位总长度(数据+头部)---反码相加法
TCP头部长度最短20字节(1字节=8位)
传输层的TCP协议最大段长度:
MSS --- 最大段长度 --- 1460字节 --- 该值会在TCP协议的前两次握手中进行协商,取二者较小的。
UDP头部
UDP头部长度8字节
1,TCP是面向链接的协议,而是无连接的协议;
TCP的三次握手----TCP建立连接的过程
*需要注意的是:
不要将确认序号Ack与标志位中的ACK搞混了。
确认方Ack=发起方Seq+1,两端配对。
1、A发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值);
2、B回复A发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段(确认序号ACK Number),ACK字段数值是在A发送过来的序列号seq的基础上加1进行回复,以便A收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接;
3、A收到B发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在B发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)。
TCP的四次挥手----TCP会话的断开
1、客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成);
2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成);
3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成);
4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)至此TCP断开的4次挥手过程完毕
#理解在四次挥手数据的传输过程中,序号并不是单纯的加1,要把该数据包中包含的字节数,也就是数据量给考虑进去,x表示所包含数据中第一个字节的序号(列如:发送一个数据包,有1000字节,被划分为三个数据段,x+300为下一个数据段中第一个字节的序号
![](https://i-blog.csdnimg.cn/blog_migrate/619443eba8acb6de92b5e67994aa660d.png)
三次握手与四次挥手,为什么挥手要多一次?
其实正常的断开和连接都是需要四次:
A发消息给B
B反馈给A表示正确收到消息
B发送消息给A
A反馈给B表示正确收到消息。
但是连接中,第二步和第三步是可以合并的,因为连接之前A和B是无联系的,所以没有其他情况需要处理。而断开的话,因为之前两端是正常连接状态(有数据传输),所以第二步的时候不能保证B之前的消息已经发送完毕,所以不能马上告诉A要断开的消息。这就是连接为什么可以少一步的原因。
IP协议
4位版本:IPV4或者IPV6
4位首部长度:标识头部总长度,用来区分从数据的开始和结尾。
8位服务类型:对需要做特殊处理的数据包标记,并对特殊标记的数据包进行特殊处理。
16位总长度:头部长度 + 数据长度
*16位标识:数据包分出来的所有片,每一片都有一个相同的标识。
*3位标志:
1,Reserved bit --- 保留位 2,Don't fragment --- 没有分片,没有分片置1,分片置0
3,More fragments --- 更多地片,不是最后一片永远置1,是最后一片置0
*13位片偏移:
8位生存时间:数据包每经过一次路由器的转发,TTL值将会减1,当TTL值为0时,路由器将不会转发该数据,直接将数据包丢弃。
8位协议:上层所使用的协议类型
TCP的协议号:6 UDP的协议号:17 ICMP的协议号:1
16位首部校验和:只校验头部内容。
IP协议最短头部长度 --- 20字节
IP的分片和TCP的分段
MTU --- 最大传输单元 --- 默认值1500字节 (可改)
MSS --- 最大段长度 --- 理论值1460字节,这个值需要进行协商,这个参数在TCP的SYN包携带,如果双方不一致,则将按照小的执行。
数据链路层 --- MAC地址
在数据链路层完成封装是由以太网协议来完成封装。
以太网:早期局域网的解决方案,依靠MAC地址进行寻址的网络,是工作在1,2层的一种网络。
以太网协议的帧结构:--- 以太网Ⅱ型帧 --- 目前最常用的Destination Address表示为为目标MAC地址
Source Addrss表示为为源MAC地址
Type表示为上层所使用的协议类型
Preamble表示为前导符 --- 固定格式的一段01 --- 目的:方便识别数据帧的开始和结束
FCS表示为帧校验序列 --- 检验数据的完整性
Data表示为数据
物理层 --- 不需要封装