zoukankan      html  css  js  c++  java
  • TCP/IP协议 | TCP协议 | UDP协议 | 三次握手四次挥手

    TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTPSMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

    1.OSI参考模型

    ==========================================

    物理层

    作用:定义一些电器,机械,过程和规范,如集线器;

    PDU(协议数据单元):bit/比特

    设备:集线器HUB;

    注意:没有寻址的概念;

    ==========================================

    数据链路层

    作用:定义如何格式化数据,支持错误检测;

    典型协议:以太网,帧中继(古董级VPN)

    PDU:frame(帧)设备:以太网交换机;

    备注:交换机通过MAC地址转发数据,逻辑链路控制;

    ===========================================

    网络层

    作用:定义一个逻辑的寻址,选择最佳路径传输,路由数据包;

    典型协议:IP,IPX,ICMP,ARP(IP->MAC),IARP;

    PDU:packet/数据包;

    设备:路由器

    备注:实现寻址

    ============================================

    传输层:

    作用:提供可靠和尽力而为的传输;

    典型协议:TCP,UDP,SPX,port(65535个端口),EIGRP,OSPF,

    PDU:fragment 段;

    无典型设备;

    备注:负责网络传输和会话建立;

    =============================================

    会话层:

    作用:控制会话,建立管理终止应用程序会话;

    典型协议:NFS, SQL, ASP, PHP, JSP, RSVP(资源源预留协议), windows, 

    备注:负责会话建立;

    ==============================================

    表示层:

    作用:格式化数据;

    典型协议:ASCII, JPEG. PNG, MP3. WAV, AVI, 

    备注:可以提供加密服务;

    ===============================================

    应用层:

    作用:控制应用程序;

    典型协议:telnet, ssh, http, ftp, smtp, rip, BGP, (未完待续)

    备注:为应用程序提供网络服务;

    ================================================

    参考:

    https://www.runoob.com/tcpip/tcpip-tutorial.html

    https://blog.csdn.net/yaopeng_2005/article/details/7064869

    2.TCP协议

    TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议。

    流程图

    这里写图片描述

    流程解释

    TCP三次握手过程

    1 主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,
    主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我.
    2 主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:
    我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我
    3 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了
    这样3次握手就完成了,主机A和主机B 就可以传输数据了.

    (没有应用层的数据,SYN这个标志位只有在TCP建立连接时才会被置1,握手完成后SYN标志位被置0)

    TCP四次挥手过程

    1 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求
    2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
    3 由B 端再提出反方向的关闭请求,将FIN置1
    4 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.

    由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端
    和接收端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础

    ACK:TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.

    SYN:同步序列号,TCP建立连接时将此位置1

    FIN:发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将此位置1

    包头结构

    内容位数
    源端口 16位
    目标端口 16位
    序列号 32位
    回应序号 32位
    TCP头长度 4位
    reserved 6位
    控制代码 6位
    窗口大小 16位
    偏移量 16位
    校验和 16位
    选项 32位(可选)

    TCP头长度+reserved+控制代码,合计为2字节,得出:TCP包头的最小长度为20字节

    TCP的可靠性依靠什么实现

    TCP的可靠性依靠以下7种机制实现:
    (1)校验和:检验范围包括TCP首部和数据部分,发送方将整个报文段以字(16位)为单位分开,并将所有段进行反码相加,结果存放在校验和字段中,接收方用同样的方法计算,若最终结果全为1则正确,否则存在错误。
    (2)序列号:TCP对每个字节的数据都进行编号。序列号作用有:
    a.保证数据不丢失
    b.保证数据按序到达
    c.提高效率,累计确认
    d.去除重复数据
    (3)确认应答机制(ACK):TCP首部有标志位ACK,当ACK=1时表示确认号有效。接收方对于按序到达的数据会进行确认,发送方如果收到已发送数据的确认报文,则继续传输下一部分数据,否则等待一段时间后启动重传机制。
    (4)超时重传机制:当数据在发送后一定时间内未收到接收方的确认,发送方就会进行重传。报文段发出到收到应答中间有一个报文段的往返时间RTT,超时重传时间RTO会略大于RTT,TCP会根据网络情况动态计算RTT,因此RTO也是不断变化的,Liunx中RTO呈指数递增,重传一定次数后关闭连接。
    (5)连接管理机制:即上面提到的三次握手和四次挥手。
    (6)流量控制:根据接收端的处理能力,来决定发送端的发送速度。TCP报文段首部有一个16位的窗口大小字段,该字段大小随着传输情况而变化,如果缓冲区满,就将窗口置为0,发送方收到后就不在发送数据,但定期会发送一个窗口探测报文,使接收方把窗口大小告诉发送方。
    (7)拥塞控制:为了防止过多数据注入网络中造成网络拥堵。主要有四种算法:慢开始、拥塞避免、快重传、快恢复。
    a.慢开始和拥塞避免
    发送方维护一个拥塞窗口cwnd,大小等于发送窗口,慢开始的思想是一开始发送方发送一个字节,在收到接收方的确认后,将拥塞窗口大小翻倍,直到拥塞窗口大小达到慢开始门限ssthresh,停止慢开始算法,采用拥塞避免算法,拥塞窗口由指数增长变为线性增长,当网络拥塞,发生超时重传时,慢开始门限变为当前拥塞窗口大小的一半,拥塞窗口大小置1,重新开始慢启动算法。
    b.快重传和快恢复
    当发送方收到3个连续的重复确认,可能不是拥塞而是报文丢失,发送方执行快重传算法,对相应报文立即重传而不是等待超时重传,同时执行快恢复算法,发送方将慢开始门限和拥塞窗口调整为当前拥塞窗口大小的一半,然后执行拥塞避免算法。

    滑动窗口协议

    滑动窗口协议(Sliding Window Protocol),该协议是 TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。

    滑动窗口分为三类:停止等待、后退N帧、选择重传

    滑动窗口保证了传输可靠,提高了传输效率和稳定性。

    参考:https://blog.csdn.net/includei/article/details/104680184

    3.UDP协议

    UDP(User Data Protocol,用户数据报协议)是一个非连接的协议。

    流程图

    这里写图片描述

    流程解释

    由于不需要建立连接,所以不断往对方主机发送UDP数据包,然后对方主机确认收到数据包,将数据包是否到达的消息及时反馈回来。

    (ping操作就是这个原理,中间会有丢包情况)

    UDP的关键点

    1.UDP传送数据的速度受到以下因素影响

    a.应用程序生成数据的速度
    b.源端和终端主机性能的限制
    c.传输带宽的限制

    2.由于不需要维护连接状态,故一台服务器可向多个客户端传输相同数据。

    一对多的关系,而TCP是一对一

    3.UDP是面向报文的

    发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

    包头结构

    内容位数
    源端口 16位
    目标端口 16位
    长度 16位
    校验和 16位

    得出:UDP包头的最小长度,为8字节

    参考:https://blog.csdn.net/u011957758/article/details/72353485

    4.三次握手四次挥手

    三次握手

    建立连接

    (1)客户端主动请求建立连接,发送SYN包(同步位SYN=1,序列号seq=x)到服务器端,并进入SYN-SENT状态,等待服务器确认;
    (2)服务器端收到客户端发来的SYN包后必须对其进行确认,同时自己也发送SYN包请求连接,即发送ACK+SYN包(确认位ACK=1,同步位SYN=1,确认号ack=x+1,序列号seq=y)到客户端,此时服务器进入SYN-RECEIVED状态;
    (3)客户端收到服务器端发来的ACK+SYN包后,向服务器发送确认包(确认位ACK=1,确认号ack=y+1,序列号seq=x+1),此包发送完毕,客户端和服务器端进入ESTABLISHED状态,三次握手完成。

    四次挥手

    断开连接

    (1)客户端发送连接释放报文(终止位FIN=1,序列号seq=u)到服务器端,并进入FIN-WAIT-1状态;
    (2)服务器端收到连接释放报文,发送确认报文(确认位ACK=1,确认号ack=u+1,序列号seq=v)给客户端,并进入CLOSE-WAIT状态。此时,客户端到服务器方向的传输释放,处于半关闭状态,但服务器端依旧可以向客户端发送数据。客户端收到服务器端的确认报文后,进入FIN-WAIT-2状态,等待服务器端发送连接释放报文;
    (3)服务器端将最后的数据发送完毕后,向客户端发送连接释放报文(终止位FIN=1,确认位ACK=1,确认号ack=u+1,序列号seq=w),并进入LAST-ACK状态;
    (4)客户端收到服务器端的连接释放报文后,发送确认报文(确认位ACK=1,确认号ack=w+1,序列号seq=u+1)给服务器端,并进入TIME-WAIT状态,在经过2MSL时间后,撤销TCB,进入CLOSED状态。

    参考:https://blog.csdn.net/u011957758/article/details/72353485

    5.UDP和TCP的区别

    角度TCPUCP
    是否连接 面向连接(发送数据前需要建立连接) 无连接(发送数据无需连接)
    是否丢包重试 实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制 不会进行丢包重试,也不会纠正到达的顺序
    模式 流模式(面向字节流) 数据报模式(面向报文)
    对应关系 一对一 支持一对一,一对多,多对一和多对多的交互通信
    头部开销 最小20字节 只有8字节
    可靠性 全双工非常可靠、无差错、不丢失、不重复、且按序到达 不保证可靠交付,不保证顺序到达
    拥塞控制 有控制 更多详情 有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
    资源要求 TCP程序结构较复杂,较多 UDP程序结构简单,少

    参考:

    https://developer.51cto.com/art/201906/597961.htm

    https://blog.csdn.net/includei/article/details/104680184

  • 相关阅读:
    hello world!
    react(一):组件的生命周期
    position和BFC
    继承
    绕不开的this
    js世界这么大,闭包想看看
    js中数组常用方法总结
    Appium混合应用测试
    手机APP兼容性测试
    运行monitor提示需要安装旧JAVA SE 6运行环境
  • 原文地址:https://www.cnblogs.com/cai-zi/p/14926284.html
Copyright © 2011-2022 走看看