UDP和TCP详解(面试必问~)

OSI 7层模型

应用层:为网络用户之间的通信提供专用的程序和协议(类比于我们需要交换物品时选择不同的电商平台,这些电商平台为交换货物提供了专用的通道和规则)
表示层:提供数据压缩、解压、加密等服务,为应用层提供语法选择,语法转换(类比于我们要卖给别人一个木柜,但体积太大,因此我们先将木柜拆成零件然后附上说明说给买家)
会话层:建立、管理和终止表示层实体之间的会话连接(类比于客服确定订单的开始结束时间以及货物的发送接受数量的)
前三层是OSI模型中的上层结构(类比于购买流程结束了,剩下如何将物品运输过去的问题)
传输层:为会话层提供可靠、无误的数据传输(类比于我们找快递公司来帮我们运输货物,快递公司会确保我们的货物被对方顺利接收)
传输层是OSI模型的中间层
网络层:基于IP地址为数据的传输进行网络间的路由选择(类比于快递公司的分拨中心,会根据地址信息提供路径选择)
数据链路层:物理地址寻址、为网络层提供数据传输服务(类比于快递到了当地的分拨中心后,会派快递小哥根据地址和电话将货物送达)
物理层:为数据传输功能物理媒介,进行数据的实际传输(类比于司机开卡运送)
后三层为OSI模型的下层结构

TCP/IP 4层模型

应用层、会话层、表示层------->应用层
传输层 -------->传输层
网络层 -------->网际互联层
数据链路层、物理层 -------->网络接口层

传输层

网络层只负责把分组发送到目的主机
但真正通信的是主机中的进程
传输层提供了进程之间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道

面向连接服务和无连接服务

面向连接的服务就是在 通信双方进行通信之前,必须先建立连接,在通信过程中,整个连接的情况一直被实时地监控和管理。但通信结束后,则应该释放这个连接

无连接的服务,两个实体之间的通信不需要先建立连接,需要通信的时候,直接将信息发送到网络中,让该信息的传递在网上尽力而为的往目的地传送

TCP/IP协议族在IP层之上使用了两个传输协议:一个是面向连接的传输控制协议TCP,当采用TCP时,传输层向上提供的是一条全双工的可靠逻辑信道
当采用UDP时,传输层向上提供的是一条不可靠的逻辑信道

TCP

TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。
由于TCP提供面向连接的可靠传输服务,因为不可避免的增加了许多开销(确认、流量控制、计时器、连接管理等)
这样会使协议数据单元的头部增大很多,还要占用很多的处理机资源
因此TCP主要只用于可靠性更重要的场合,如文件传输协议ftp、超文本传输协议http,远程登录telnet等等

TCP报文段

TCP传送的数据单元称为报文段
一个TCP报文段分为TCP首部和TCP数据两部分
整个TCP段作为IP数据报的数据部分封装在IP数据报中
TCP首部的前20字节是固定的,首部最短为20字节,后面有4N字节是根据需要而增加的选项,通常长度为4字节的整数倍
TCP首部

TCP报文段既可以用来运载数据也可以用来建立连接、释放连接和应答
源端口和目的端口字段:各占两个字节,也就是16位+16位=32位,端口是运输层与应用层的服务接口
端口号是为了标识本计算机应用层中的各进程
这两个字段标识数据从哪个进程来,到哪个进程去
序列号字段:占4个字节,TCP是面向字节流的,传送的时候按照一个字节一个字节来
所以TCP连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
例如:一个报文的序号字段值是301,携带的数据共有100字节,这就说明本报文段的数据的最后一个字节的序号是400,那么下一个报文段的数据序号应从401开始
确认号字段:占4个字节,是期望收到对方的下一个报文段的数据的第一个字节的序号,若确认号=N,则表明到序号N-1为止的所有数据都已经正确收到
首部长度:占4位!表示首都长度,表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP报头的最大长度是15*4=40字节
保留字段:占6位,保留为今后使用,但目前应该置为0,该字段可以忽略不计
紧急位URG:当URG=1,表明紧急指针字段有效,它告诉系统此报文段中有紧急数据,应尽快传达,相当于优先级较高的数据,
URG需要和紧急指针配套使用,也就是说数据从第一个字节到紧急指针所指字节就是紧急数据
确认位ACK:只有当ACK=1时确认号有效,ACK=0时确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1
推送位PSH:TCP收到PSH=1的报文段,就立刻从TCP缓冲区把数据读走
复位位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接
同步位SYN:同步位SYN=1表示这是一个连接请求或者连接接收报文
当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN=1,ACK=1
即SYN=1就表示这是一个连接请求或者连接接收报文
终止位FIN:用来释放一个连接,FIN=1表明此报文段的发送方的数据已经发送完毕,并要求释放传输连接
窗口字段:占2个字节,表示允许对方发送的数据量,接收方的数据缓存空间是有限的,故用窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节
例如确认号是701,窗口字段是1000,这就说明从701号算起,发送次报文段的一方还有接受1000字节数据的接收缓存空间
检验和:占2个字节,检验和字段检验的范围包括首部和数据
在计算机检验和时,和UDP一样,要在TCP报文段的前面加上12字节的伪首部
紧急指针字段:占16位,指出在本报文段中紧急数据共有多少个字节
选项字段:长度可变,最大报文段长度是TCP报文段中的数据字段的最大长度
填充字段:是为了使整个首部长度是4字节的整数倍

TCP三次握手

TCP是面向连接的协议,因此每一个TCP连接都有三个阶段:连接建立、数据传送和连接释放
在TCP连接建立的过程中还要解决以下三个问题:
1.要使每一方都能够知道对方的存在
2.要允许双方协商一些参数(如最大窗口值、时间戳等)
3.能够对运输实体资源(缓存大小等)进行分配
**TCP连接的端口叫做套接字或插口(不是主机、不是主机的IP地址、不是应用进程、不是传输层的协议端口)**端口拼接到IP地址即构成了套接字

三次握手是TCP连接的建立过程:
1.客户机的TCP首先向服务器的TCP发送一个连接请求报文段
其首部的SYN字段置为1,另外,客户机会随机选择一个起始序号seq=x(连接请求报文不携带数据,但是要消耗掉一个序号)
2.服务器的TCP收到连接请求后,如果同意建立连接就向客户机发回确认,并为该TCP连接分配TCP缓存和变量
在确认报文中,SYN和ACK字段都被置为1,确认号的字段值为x+1,并且服务器随机产生起始序号seq=y
3.当客户机收到确认报文之后,还要向服务器给出确认,并且也要给该链接分配缓存和变量
ACK字段置为1,序号字段为x+1,确认号字段为y+1
该报文段可以携带数据,如果不携带数据则不消耗序号

为什么要三次握手了?
假如说只有两次握手,客户机在发送请求连接的报文时在网络中滞留的时间太长,客户机长时间没有收到服务器的确认报文,以为没有服务器没有收到,这时候又重新向服务器发送了请求连接,此后客户机和服务器经过两次握手建立连接,开始传输数据,释放连接。此时客户机第一次发送的请求连接到达了服务器,这个报文本该是失效的,但是服务器不知道,以为是一个正确请求报文,于是客户端和服务器又会再次建立连接,这样会导致不必要的错误和资源浪费
采用三次握手,当服务器收到在网络中滞留很久的失效请求报文,并且向客户机发送了确认报文,但是客户机不会向服务器再次发出确认,服务器没有收到客户机的确认报文,就知道客户机没有请求连接!

TCP四次挥手

TCP连接的释放要经历4个步骤:
1.客户机打算要关闭连接,向服务器发送一个连接释放报文段,并停止再次发送数据,主动关闭TCP连接
该报文段的FIN字段被置为1,序号为u,这个u等于前面已经传送过的数据的最后一个字节的序号加1
TCP是全双工的,此时客户端这一方关闭了数据通路,但是对方还是可以发送数据
2.服务器收到连接释放的报文段后发出确认,确认号是u+1,而这个报文段自己的序号字段是v,这个v等于它前面已经传送过的数据的最后一个字节序号加1,
此时从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态
但服务器若发送数据,客户机仍要接受(从服务器到客户机这个方向的连接还没有关闭)
3.若服务器已经没有要向客户机传送的数据,就向客户机发送连接释放报文,此时FIN字段为1,确认号还是u+1,序号字段为w
4.客户机收到服务器的连接释放报文之后,必须发出确认,在确认报文中,ACK字段为1,确认号为w+1,序号为u+1
此时TCP连接还没有释放掉,必须要经过时间等待计时器设置的时间:最大报文存活时间后,TCP连接才是关闭状态

为什么最后客户机要等待一个最大报文存活时间呢?
1.保证客户机最后发送的确认报文能够到达服务器,因为这个确认报文是可能丢失的,假如说服务器发送了连接释放报文但是客户机还没有给确认报文, 服务器又会发送一个连接释放报文,而客户端可以在这个 最大报文存活时间里 收到这个重传的报文,接着给出回应报文,然后重置计时器
2.防止类似三次握手中失效报文出现在连接中。客户端发送完确认报文后,在这个 最大报文存货时间里,可以使本连接持续的时间内所产生的所有报文段都从网络中消失,新的连接中不会出现旧连接的请求报文。

UDP

UDP是一个无连接的非可靠的传输层协议。它在IP层之上仅提供两个附加服务:多路复用和对数据的错误检查。
UDP在传送数据之前不需要建立连接,远程主机的传输层收到UDP报文之后,不需要给出确认
由于UDP比较简单,其执行速度就比较快、实时性好,使用UDP的应用主要包括小文件传送协议如DNS、SNMP等

UDP报文

UDP是面向报文的,报文不可分割,是UDP数据报处理的最小单位
UDP数据报包含两个部分:UDP首部和用户数据
UDP报文
UDP首部有8个字节,由4个字段组成,每个字段长度都是2个字节
源端口:源端口号,在需要对方回信时选用,不需要时可用全0
目的端口:目的端口号,这在终点交付报文时必须要使用到
长度:UDP数据报长度(包括首部和数据,其最小值是8字节,仅有首部)
校验和:检测UDP数据报在传输中是否有错,有错就丢失,该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0

UDP使用场景

UDP常用于一次性传输比较少量数据的网络应用,例如DNS、SNMP等,因为这些应用如果采用TCP,则建立连接,维护和拆除会带来不小的开销
UDP也常用于多媒体应用,如IP电话,实时视频会议,流媒体等,显然,可靠数据传输对这些应用来说不是最重要的,TCP拥塞控制会导致数据出现较大的延迟,这是这些应用不能容忍的

参考

https://www.zhihu.com/search?type=content&q=osi%E6%A8%A1%E5%9E%8B
https://zhuanlan.zhihu.com/p/108822858
https://blog.csdn.net/qzcsu/article/details/72861891

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值