浅谈通信协议之 TCP与TCP/IP

浅谈通信协议之 TCP与TCP/IP

通信模型

起源

由于计算机网络的飞速发展,各大产商根据自己的协议生产不同的硬件和原件,为了保证各种网络技术能够和谐共存和良好的配合,国际标准化组织(ISO)于1984年建立一套抽象的分层结构ISO/OSI(国际标准化组织的开放网络架构)。

七层参考模型

七层模型

 

 

 

  1. 物理层
    物理层主要是在物理层面解决基础的传送通道,建立,维护和释放物理链路所需要的机械的、电气/光学的、功能的和规程的特性,如光缆的抗衰耗,无线设备的发射功率如何提高等物理设施问题。

  2. 数据链路层
    数据链路层提供简单的通信链路,通信实体所在的系统必须经过物理介质直接相连(如光缆,电缆,微波等)。将物理层提供的比特流组成“帧”,即将发送方发送的若干“位”的数据组成一组,加上“开始”“结束”标志和检错相关代码,形成具有固定格式的数据帧
    本层要提供一定的差错检验和纠正机制,以防信号在传输过程中因机械和电气以及外界干扰情况下出现错误。因此数据帧在发送时会有相应信息存放在纠错字节中,当到达目的地之后,会对自身进行计算,计算结果和纠错字节中的内容进行比对,如果一致,进行下一步操作,不一致则纠错字节可以将结果检测出来,并要求重传。

  3. 网络层
    网络层主要提供网络服务,一种是面向连接的有轨网络服务,一种是无连接的无轨网络服务。
    网络层肩负着如下四大任务:

    • 路由选择:发现路由,选择路径,有时也负责地址转换,管理来来往往的数据包。
    • 拥塞控制:采用拥塞控制机制,尽量避免拥塞的发生,或者在发生拥塞时,通过多种途径缓解拥塞状况(比如丢弃一些数据,或者进行缓存)。
    • 局域网互联:如统计哪些用户需要的网络流量比较多,访问哪些站点比较频繁,或者禁止或控制用户访问某些站点;记账功能一般也在网络层解决。
    • 统计和控制:如统计哪些用户需要的网络流量比较多,访问哪些站点比较频繁,或者禁止或控制用户访问某些站点;记账功能一般也在网络层解决。
      (IP协议就是网络层协议)
  4. 传输层
    传输层的任务是向用户提供可靠的、透明的端到端的数据传输,以及差错控制和流量控制机制。使得底层的网络硬件对高层不可见,即会话层、表示层、应用层的设计不用考虑底层细节。起到承上启下的作用。
    传输层通过逻辑接口向高层提供服务。服务的类型是在连接建立时确定的,此时提供端到端的、可靠的、面向连接的字节流服务。
    (TCP和UDP就属于传输层协议)

  5. 会话层
    会话层在不同的机器之间提供会话进程的通信,如建立、管理和拆除会话进程。同时也提供许多增值服务,如交互式对话,机器之间的同步控制等。

  6. 表示层 表示层处理通信进程之间交换数据的表示方法,包括语法转换、数据格式的转换、加密与解密、压缩与解压缩等。

  7. 应用层 应用层负责管理应用程序之间的通信

TCP与TCP/IP

OSI由于体系比较复杂,不太方便计算机软件是实现,于是TCP/IP技术应运而生。TCP/IP同样采用分层结构,在TCP/IP去除了OSI的表示层和会话层。

OSI与TCP/IP模型对照

 

还有一种五层的说法,将网络接口层分为物理层和数据链路层两层,这样有利于数据通信的分析。TCP/IP体系结构中最核心的部分是上面的三层:应用层、传输层和互联网层(也称网络层),互联网层以下的层次没有制定相关标准 TCP/IP是一个协议组,其中包含有TCP、IP,还包括HTTP、TELNET、FTP、RIP、OSPF、BGP、UDP、ARP、pop3等众多协议。

各层主要功能:

  1. 网络接口层也称为数据链路层,TCP/IP并没有严格定义该层,它只是要求能够提供给其上层——网络层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。以太网是IP通信中数据链路层最常见的形式,除此之外还有PPP、HDLC等。10Gbit/s以下的以太网一般应用于局域网,而PPP、HDLC则应用于广域网范围内居多。

  2. 网络接口层也称为数据链路层,TCP/IP并没有严格定义该层,它只是要求能够提供给其上层——网络层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。以太网是IP通信中数据链路层最常见的形式,除此之外还有PPP、HDLC等。10Gbit/s以下的以太网一般应用于局域网,而PPP、HDLC则应用于广域网范围内居多。

  3. 传输层:传输控制协议(Transmission Control Protocol,TCP)和用户数据报协议(User Datagram Protocol,UDP)是该层的重要协议。TCP是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP还要处理端到端的流量控制。UDP是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合

TCP报文

TCP报文格式

 

  1. 源端口和目的端口字段——各占16bit。端口是传输层与应用层的服务接口

  2. 序号字段——SEQ序号,占32bit。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

  3. 序号字段——SEQ序号,占32bit。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

  4. 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下。

    紧急比特 URG——当 URG=1 时,表明紧急指针(urgent pointer)字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

    确认比特ACK——只有当ACK=1时确认号字段才有效。当 ACK=0时,确认号无效。推送比特PSH(PuSH)——接收TCP收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。

    复位比特 RST(ReSeT)——当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

    同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。

    终止比特 FIN(FINal)——用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
    需要注意的是:不要将确认序号ACK与标志位中的ACK搞混了;确认方ACK=发起方SEQ+1,两端配对。

  5. 数据偏移——占4bit,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。

  6. 窗口字段——占16bit。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限

  7. 检验和——占16bit。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

  8. 紧急指针字段——占16bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。

  9. 选项字段——长度可变。TCP只规定了一种选项,即最大报文段长度MSS(Maximum Segment Size)。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节

  10. 保留字段——占6bit,保留为今后使用,但目前应置为0。

TCP的三次握手和四次挥手

TCP的连接和建立都是采用客户服务器方式。主动发起连接建立的应用进程叫作客户(Client)。被动等待连接建立的应用进程叫作服务器(Server)

  • 三次握手
    在TCP/IP中,采用三次握手建立一个连接,连接过程就像打电话的过程

三次握手模型

 

第一次握手:Client(主机A)向Server(主机B)发送一个连接请求,在这个包中,标志位SYN=1,发送序号SEQ=x,上图中x=200,Client进入SYNSEND状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,确认序号ACK=x+1=201,随机产生一个发送序号SEQ=y,上图中y=500,并将该数据包发送给Client以确认连接请求,Server进入SYNRCVD状态。

第三次握手:Client收到确认后,检查确认序号ACK是否为x+1=201,标志位ACK是否为1,如果正确,则将标志位ACK置为1,确认序号ACK=y+1=501,并将该数据包发送给Server,Server检查确认序号ACK是否为y+1=501,标志位ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态。
完成三次握手,客户端与服务器开始传送数据。

  • 四次挥手

四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开,

四次挥手模型

 

 第一次挥手:当客户A要断开TCP连接时,发送一个包,其中标志位fin=1,ACK=1,发送序号SEQ=x,确认序号ACK=y,上图中x=200,y=500。Client进入FINWAIT1状态。
第二次挥手:客户B知道A要断开后,发送一个确认包,其中标志位ACK=1发送序号,SEQ=y确认序号ACK=x+1=201,Server进入CLOSE_WAIT状态。
第三次挥手:客户B也断开TCP连接,此时发送一个包,其中,标志位fin=1,发送序号SEQ=y+1=501,Server进入LASTACK状态。
第四次挥手:客户A收到B的断开请求后,Client进入TIMEWAIT状态,接着发送一个确认包,标志位ACK=1,发送序号SEQ=x+1=201,确认序号ACK=y+2=502;Server进入CLOSED状态。

 

posted @   love_siting  阅读(134)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示