深刻理解TCP/IP协议

若是咱们想了解TCP/IP的参考模型,首先咱们要对开放系统互连参考模型(Open System Interconnect 简称OSI)有必定的了解,这样有助于加深对TCP/IP的理解。git

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

开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。github

概述

开放系统互连参考模型为实现开放系统互连所创建的通讯功能分层模型,简称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) 提供机械、电气、功能和过程特性(网卡、网线、双绞线、同轴电缆、中继器)

2、TCP/IP参考模型

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

经常使用协议

TCP/IP协议被称为传输控制协议/互联网协议,又称网络通信协议 是由网络层的IP协议和传输层的TCP协议组成,是一个很大的协议集合 物理层和数据链路层没有定义任何特定协议,支持全部的标准和专用的协议服务器

网络层定义了网络互联也就是IP协议
  1. 网际协议IP(Internet Protocal) 负责主机和网络之间寻址和路由数据包
  2. 地址解析协议ARP(Address Resolution Protocol) 得到同一物理网络中的硬件主机MAC地址
  3. 反向地址转换协议(Reverse Address Resolution Protocol) 容许局域网的物理机器从网关服务器的ARP表或者缓存上请求其IP地址
  4. 网际控制消息协议ICMP(Internet Control Message Protocol) 发送消息,并报告有关数据包的传送错误
  5. 互联组管理协议IGMP(Internet Group Management Protocol) IP主机向本地多路广播路由器报告主机组成员

传输层定义了TCP(传输控制协议)和UDP(用户数据报)协议 应用层定义了HTTP(超文本传输协议)、FTP(文件传输协议)、DNS(域名系统)等协议网络

TCP/IP参考模型个别层上的协议名和数据名称

X层 协议名称 数据名称
传输层(Transport) TCP 块(Segment)
网络层(Network) IP 包(Packet)
数据链路层(Data Link) ARP 帧(Frame)

数据从应用层发下来,会在每一层都会加上头部信息,进行封装,而后再发送到数据接收端。这个基本的流程你须要知道,就是每一个数据都会通过数据的封装和解封装的过程。并发

TCP协议格式

如图: 框架

每一个部分的功能
  1. Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号;用于区别主机中的不一样进程,而IP地址是用来区分不一样的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能惟一的肯定一个TCP链接;
  2. Sequence Number:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题;
  3. Acknowledgment Number:32位确认序列号包含发送确认的一端所指望收到的下一个序号,所以,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题;
  4. Offset:给出首部中32 bit字的数目,须要这个值是由于任选字段的长度是可变的。这个字段占4bit(最多能表示15个32bit的的字,即4*15=60个字节的首部长度),所以TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节;
  5. Window:窗口大小,也就是有名的滑动窗口,用来进行流量控制;这是一个复杂的问题,这篇博文中并不会进行总结的;
  6. 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数据包后,链接将被断开。这个标志的数据包也常常被用于进行端口扫描。

三次握手和四次挥手

三次握手
  1. 第一次握手:创建链接。客户端发送链接请求报文段,将SYN位置为1,Sequence Number为x;而后,客户端进入SYN_SEND状态,等待服务器的确认;
  2. 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,须要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,本身本身还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述全部信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK报文段。而后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕之后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

完成了三次握手,客户端和服务器端就能够开始传送数据。以上就是TCP三次握手的整体介绍。

四次分手

当客户端和服务器经过三次握手创建了TCP链接之后,当数据传送完毕,确定是要断开TCP链接的啊。那对于TCP的断开链接,这里就有了神秘的“四次分手”。

  1. 第一次分手:主机1(可使客户端,也能够是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
  2. 第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“赞成”你的关闭请求;
  3. 第三次分手:主机2向主机1发送FIN报文段,请求关闭链接,同时主机2进入LAST_ACK状态;
  4. 第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,而后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段之后,就关闭链接;此时,主机1等待2MSL后依然没有收到回复,则证实Server端已正常关闭,那好,主机1也能够关闭链接了。

到这里咱们是否是很是疑惑,为何要三次握手、四次分手呢?

先来回答为何要三次握手?

在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误”。在另外一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。

在谢希仁著《计算机网络》书中同时举了一个例子,以下:

“已失效的链接请求报文段”的产生在这样一种状况下:client发出的第一个链接请求报文段并无丢失,而是在某个网络结点长时间的滞留了,以至延误到链接释放之后的某个时间才到达server。原本这是一个早已失效的报文段。但server收到此失效的链接请求报文段后,就误认为是client再次发出的一个新的链接请求。因而就向client发出确认报文段,赞成创建链接。假设不采用“三次握手”,那么只要server发出确认,新的链接就创建了。因为如今client并无发出创建链接的请求,所以不会理睬server的确认,也不会向server发送数据。但server却觉得新的运输链接已经创建,并一直等待client发来数据。这样,server的不少资源就白白浪费掉了。采用“三次握手”的办法能够防止上述现象发生。例如刚才那种状况,client不会向server的确认发出确认。server因为收不到确认,就知道client并无要求创建链接。”

总结:三次握手是为了防止了服务器端的一直等待而浪费资源。

为何要四次分手?

那四次分手又是为什么呢?TCP协议是一种面向链接的、可靠的、基于字节流的运输层通讯协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经所有发送完毕了;可是,这个时候主机1仍是能够接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,可是主机2仍是能够发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,以后彼此就会愉快的中断此次TCP链接。

TCP功能

  1. 将数据进行分段打包传输
  2. 对每一个数据包编号控制顺序
  3. 运输中丢失、重发和丢弃处理
  4. 流量控制避免拥塞

推荐文章

相关文章
相关标签/搜索