网络协议---TCP(有点长)vs UDP

一、预备知识

1.理解源IP地址和目的IP地址

2.认识端口号

  • 端口号是一位32位的整数
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
  • IP地址+端口号能够标识网络上的某一台主机的一个进程
  • 一个端口号只能被一个进程占用

3.理解“端口号”和“进程ID”

一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定

二、TCP协议vs UDP协议

1.TCP协议

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

2.UDP协议

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报,最大不超过64K

三、浅谈UDP

不保证安全,性能比较好

1.UDP协议的特性

  • 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接
  • 不可靠,即没有确认应答机制,没有超时重传机制,没有连接管理机制,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息
  • 面向数据报,最大不超过64K,不能够灵活的控制读写数据的次数和数量,应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并
  • 具有接收缓冲区,没有发送缓冲区

2.UDP的使用注意事项

UDP协议首部有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部),然而64K在当今的互联网环境下,是一个非常小的数字,如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装

四、理解TCP(重点)

即传输控制协议,就是要对数据的传输进行一个详细的控制

1.基础知识

  • 源、目的端口号:表示数据是从哪个进程来,到哪个进程去
  • 32位序号/32位确认号
  • 4位TCP报头长度,表示该TCP头部有多少个bit
  • 6位标志位
    URG:紧急指针是否有效
    ACK:确认号是否有效
    PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    RST:对方要求重新建立连接,我们把携带RST标识的称为复位报文段
    SYN:请求建立连接,我们把携带SYN标识的称为同步报文段
    FIN:通知对方,本端要关闭了,我们成携带FIN标识的称为结束报文段
  • 16位窗口大小
  • 16位校验和
  • 16位紧急指针
  • 40字节头部选项

2.原理

(1)确认应答(ACK)机制
在这里插入图片描述
TCP将每个字节的数据都进行了编号,即为序列号,每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据,下一次你从哪里开始发
(2)超时重传机制
系统基于TCP协议实现,动态计算报文的最大生存时间(MSL),超时时间设置为2MSL
作用:超过超时时间表示丢包(发送、接收确认数据报),需要重新发送数据报(系统中发送缓冲区保存有数据,可以重发)
(3).连接管理机制(重点)
三次握手建立连接四次挥手断开连接
建立连接和关闭连接都是单方向的
经典面试题汇总:

  • 表达TCP三次握手的流程/过程
    首先,客户端发送一个SYN到服务端,服务端接收到以后返回一个堆这条SYN建立请求的ACK响应,并且发送一个服务端到客户端建立连接的SYN请求合并发送回客户端,客户端接收到以后相当于是客户端到服务端的连接就建立起来了,但这时还没有建立服务端到客户端的连接,客户端还要回复一个ACK的响应,在服务端接收到这个ACK响应以后,服务端到客户端的连接就建立起来了
  • 能否四次握手?能否二次握手?
    可以超过三次,因为SYN和ACK可以拆开来发送,但不能小于三次
  • 表达四次挥手的过程

中断连接端可以是客户端,也可以是服务器端。
第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

  • 能否三次挥手?能否五次挥手?
    不能三次挥手,可以五次挥手
    第二次ACK是系统内核实现的ACK响应,而FIN是用户程序手动关闭,目的是让用户程序在关闭连接前处理需要的任务(如释放资源)
  • 为什么TIME_WAIT的时间是2MSL
    返回的ACK传输时间+服务端重新发送FIN的传输时间
    发送端、接收端:单次数据发送时,存在发送端发送数据到接收端,在多次数据发送时,双方可以是发送端,又可以是接收端
  • CLOSE_WAIT状态
    服务端程序没有调用close方法,导致出现大量的连接处于CLOSE_WAIT状态,代表半关闭,是一种bug
  • 在第三次数据传输,服务端发送FIN请求到客户端,客户端处于TIME_WAIT状态,为什么不能设置为CLOSED状态?
    第四次ACK响应报文可能丢包,导致服务端无法关闭连接,需要服务端重新发送FIN请求,所以客户端必须等待最大超时时间(2MSL)
    (4)滑动窗口:处于发送端
    窗口的大小指的是无需等待确认应答而可以继续发送数据的最大值,ACK响应报文中,携带下一个信号是多少,表示在此之前的所有数据都已经接收到
    窗口的滑动:依赖ACK响应报文中的下一个序号来进行滑动,而下一个序号是多少,又依赖接收到的连续报文的最大序号
    操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有确认应答过的数据,才能从缓冲区删掉
    (5)流量控制
    接收端:通过TCP协议头中的“窗口大小”字段,告诉发送端,发送数据的大小
    目的:接收端能力有限,为了防止接收缓冲区被打满,再接收数据就会直接被丢弃,使用窗口大小可以告诉发送端发送数据的大小
    (6)拥塞控制
    因为网络上有很多的计算机。可能当前的网络状态就已经比较拥塞,在不清楚当前网络状态下,贸然发送大量的数据,是很有可能引起雪上加霜的,TCP引入慢启动机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据
    原理:拥塞窗口初始值为1,以慢启动指数级增长的方式,达到一定阈值,转变为线性增长的方式
    (7)延迟应答机制
    原理:接收到多个数据报时,不针对每条数据报响应ACK,而是延迟一定时间,这样接收缓冲区很快被处理,可用空间就更大,返回的窗口大小字段就可以设置的更大,使网络吞吐量更大,传输效率更高
    延迟依据:数量、时间都是由系统决定
    (8)捎带应答
    在延迟应答的基础上, 我们发现, 很多情况下, 客户端服务器在应用层也是 “一发一收” 的. 意味着客户端给服务器说了
    “How are you”, 服务器也会给客户端回一个 “Fine, thank you”;
    那么这个时候ACK就可以搭顺风车, 和服务器回应的 "Fine, thank you"一起回给客户端
    (9)粘包问题
    如何避免:明确两个包之间的边界(实现应用层用户程序中使用的协议来进行数据的解析/格式)
    UDP不存在此问题

3.TCP安全机制

  • 确认应答机制
  • 超时重传机制
  • 连接管理机制
  • 流量控制
  • 拥塞控制

4.TCP性能机制

  • 滑动窗口
  • 延迟应答
  • 捎带应答

五、场景分析

  • TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景
  • UDP用于对高速传输和实时性要求较高的通信领域,例如:早起的QQ、视频传输等,另外UDP可以用于广播
    总而言之,TCP和UDP都是程序猿的工具,什么时机用,具体怎么用,还是要根据具体的需求场景去判定
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值