ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深入理解TCP协议及其源代码

2019-12-26 21:02:54  阅读:227  来源: 互联网

标签:参考模型 ACK 主机 报文 SYN TCP 深入 源代码


本次实验我们将深入理解TCP协议,从而了解一次TCP连接建立的过程中,到底做了哪些工作。

在开始研究TCP协议之前,我们先来了解一下两种网络参考模型:OSI参考模型和TCP/IP参考模型

一、开放系统互连参考模型(Open System Interconnect 简称OSI)

  开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。   开放系统互连参考模型为实现开放系统互连所建立的通信功能分层模型,简称OSI参考模型。其目的是为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考。这里所说的开放系统,实质上指的是遵循OSI参考模型和相关协议能够实现互连的具有各种应用目的的计算机系统。

 

 

 

 

 

 

 

 

 

 

 

 

  OSI参考模型是计算机网路体系结构发展的产物。它的基本内容是开放系统通信功能的分层结构。这个模型把开放系统的通信功能划分为七个层次,从邻接物理媒体的层次开始,分别赋于1,2,……7层的顺序编号,相应地称之为物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。每一层的功能是独立的。它利用其下一层提供的服务并为其上一层提供服务,而与其他层的具体实现无关。这里所谓的“服务”就是下一层向上一层提供的通信功能和层之间的会话规定,一般用通信原语实现。两个开放系统中的同等层之间的通信规则和约定称之为协议。通常把1~4层协议称为下层协议,5~7层协议称为上层协议。

OSI七层模型每层的功能简介

  1. 应用层(Application) 提供网络与用户应用软件之间的接口服务
  2. 表示层(Presentation) 提供格式化的表示和转换数据服务,如加密和压缩
  3. 会话层(Session) 提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制
  4. 传输层(Transimission) 提供建立、维护和取消传输连接功能,负责可靠地传输数据(PC)
  5. 网络层(Network) 处理网络间路由,确保数据及时传送(路由器)
  6. 数据链路层(DataLink) 负责无错传输数据,确认帧、发错重传等(交换机)
  7. 物理层(Physics) 提供机械、电气、功能和过程特性(网卡、网线、双绞线、同轴电缆、中继器)
  比较有趣的是,OSI模型由官方组织制定,却未能成为各大商家发行计算机的通用标准,反而是由民间自行演化的TCP/IP参考模型成为国际通行标准。

二、TCP/IP参考模型

  TCP/IP是传输控制协议/网络互联协议的简称,早期的TCP/IP模型是一个四层结构,从下往上依次是网络接口层、互联网层、传输层和应用层,后来在使用过程中,借鉴OSI七层参考模型,将网络接口层划分为了物理层和数据链路层,形成五层结构;

                                                         其中的传输层就定义了我们本次要研究的面向连接TCP协议,此外这一层还定义了非连接的UDP协议;

三、TCP协议

  在传输层,传输的数据被称为segment,即数据段,每个数据段都有一个头,用来唯一的标识该数据段,头的格式如下

 

 

 

 

 

 

 

 

 

 

各个部分的功能


  Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号;用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接;
  Sequence Number:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题;
  Acknowledgment Number:32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题;
  Offset:表明首部的长度,单位是32bit,根据任选字段的使用首部长度会发生变化。这个字段占4bit(最多能表示15个32bit的的字,即4*15=60个字节的首部长度),因此TCP最多有60字节的首部。如果没有使用任选字段,通常的长度是20字节;
  TCP Flags:TCP首部中有6个标志比特,它们中的多个可同时被设置为1,主要是用于操控TCP的状态机的,依次为URG,ACK,PSH,RST,SYN,FIN。每个标志位的意思如下:
    URG:此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;

    ACK:此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为0;

    PSH:这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;

    RST:这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包;

    SYN:表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来 ,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手;

    FIN: 表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描;

  Window:窗口大小,也就是有名的滑动窗口,用来进行流量控制,表明自己剩余的窗口大小,这样对方就可以控制发送数据的速度;   Checksum:校验和,由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障;   Urgent pointer:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此这个字段是紧急指针相对当前序号的偏移量。发送紧急数据时会用到这个;   TCP Options:最后一个选项字段是可变长的可选信息,最多包含40字节的数据;

四、三次握手与四次挥手

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三次握手

  第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为M;然后,客户端进入SYN_SEND状态,等待服务器的确认;

  第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为M+1(Sequence Number+1,表示期望收到M+1开始的数据段);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为N;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

  第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为N+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手;

  需要注意的是在三次挥手过程中,前两次挥手是不能携带数据的,而第三次挥手客户端是可以在数据段中填充数据的,完成了三次握手,客户端和服务器端就可以开始进行可靠的TCP传送。以上就是TCP三次握手的总体介绍。

四次挥手

  客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,客户端就会主动发出断开连接申请,也可以是服务端出于某些需要主动断开连接,对于TCP的断开连接,并不是直接关闭,TCP协议中规定了这个过程需要“四次挥手”。

  第一次挥手:主机1(可以是客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段(即设置FIN标志为1);此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了,主机1关闭发送功能,但是接收功能依然保留;
  第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求,主机2进入CLOSE_WAIT状态;
  第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
  第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

标签:参考模型,ACK,主机,报文,SYN,TCP,深入,源代码
来源: https://www.cnblogs.com/meijlin/p/12104347.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有