浅谈TCP/IP

TCP/IP四层协议系统

  1. 链路层,有时也称做数据链路层或网络接口层,一般包括操做系统中的设备驱动程序和计算机中对应的网络接口卡。它们一块儿处理与电缆(或其余任何传输媒介)的物理接口细节。算法

  2. 网络层,有时也称做互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。缓存

  3. 运输层主要为两台主机上的应用程序提供端到端的通讯。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。服务器

  • TCP为两台主机提供高可靠性的数据通讯。它所作的工做包括把应用程序交给它的数据分红合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。因为运输层提供了高可靠性的端到端的通讯,所以应用层能够忽略全部这些细节
  • UDP则为应用层提供一种很是简单的服务。它只是把称做数据报的分组从一台主机发送到另外一台主机,但并不保证该数据报能到达另外一端。任何须需的可靠性必须由应用层来提供
  1. 应用层负责处理特定的应用程序细节。几乎各类不一样的TCP/IP实现都会提供下面这些通用的应用程序:
  • Telnet 远程登陆。
  • FTP 文件传输协议。
  • SMTP 简单邮件传送协议。
  • SNMP 简单网络管理协议

链路层

Internet协议族中的最底层协议,链路层协议 在TCP/IP协议族中,链路层主要有三个目的:网络

  • 为IP模块发送和接收IP数据报
  • 为ARP模块发送ARP请求和接收ARP应答
  • 为RARP发送RARP请求和接收RARP应答

TCP/IP支持多种不一样的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、FDDI(光纤分布式数据接口)及RS-232串行线路等分布式

以太网链路层协议 , 两个串行接口链路层协议 ( S L I P 和 P P P ), 以及大多数实现都包含的环回( l o o p b a c k )驱动程序oop

SLIP:串行线路IP测试

它是一种在串行线路上对IP数据报进行封装的简单形式,下面的规则描述了SLIP协议定义的帧格式:操作系统

  • IP数据报以一个称做END( 0xc0)的特殊字符结束,同事为了防止数据报到来以前的线路噪声被当成数据报内容,大多数实如今数据报的开始出也传一个END字符(若是有线路噪声,那么END字符将技术这份错误的报文,这样当前的报文得以正确的传输,而前一个错误报文交给上层后,会发现其内容毫无心义而被丢弃)
  • 若是IP报文中某个字符为END,那么就要连续传输两个字节0xdb和oxdc来取代它。oxdb这个特殊字符被称做SLIP的ESC字符
  • 若是IP报文中的某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb和oxdd来取代它

SLIP是一种简单的帧封装方法,其中有一些缺陷:code

  • 每一端必须知道对象的IP地址,没有办法把本端的IP地址通知给另外一端
  • 数据帧中没有类型字段,若是一条串行线路用于SLIP,那么它不能同时使用其余协议
  • SLIP没有再数据帧中加上检验和,若是SLIP传输的报文被线路噪声影响而发生错误,只能经过上层协议来发现(另外一种方法是新型的调制解调器能够检测并纠正错误报文)

尽管存在这些缺点, SLIP仍然是一种普遍使用的协议cdn

PPP:点对点协议

PPP点对点协议修改了SLIP协议中的全部缺陷,PPP包括如下三个部分:

  • 1 ) 在串行链路上封装IP数据报的方法。PPP既支持数据为8位和无奇偶检验的异 步模式 (如大多数计算机上都广泛存在的串行接口),还支持面向比特的同步连接
    1. 创建、配置及测试数据链路的链路控制协议( LCP : LinkControlProtocol )。它容许通讯双方进行协商,以肯定不一样的选项
    1. 针对不一样网络层协议的网络控制协议( NCP : NetworkControlProtocol )体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk

PPP比SLIP具备下面这些优势:

  • PPP支持在单根串行线路上运行多张协议,不仅是IP协议
  • 每一帧都有循环冗余检验
  • 通讯双方能够进行IP地质的动态协商(使用IP网络控制协议)
  • 与CSLIP相似,对于TCP和IP报文首部进行压缩
  • 链路控制协议能够对多个数据链路选项进行设置

为这些优势付出的代价是在么一帧的首部增长3个字符,当创建链路时要发送几帧协商数据,以及更为复杂的实现

环回接口

大多数的产品都支持环回接口( Loopback Interface),以容许运行在同一台主机上的客户程序和服务器程序经过TCP/IP进行通讯

A类网络号127就是为环回接口预留的,根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost

一个传给环回接口的IP数据报不能再任何网络上出现:一旦传输层检测到目的端地址是环回地址时,应该能够省略部分传输层和所 有网络层的逻辑操做。可是大多数的产品仍是照样完成传输层和网络层的全部过程,只是当I P 数据报离开网络层时把它返回给本身

下图为环回接口处理IP数据报的过程

图中须要指出的关键点是:

    1. 传给环回地址(通常是127.0.0.1 )的任何数据均做为IP输入
    1. 传给广播地址或多播地址的数据报复制一份传给环回接口,而后送到以太网上
    1. 任何传给该主机IP地 址的数据均送到环回接口

最大传输单元MTU

以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节。链路层的这个特性称做MTU,最大传输单元,不一样类型的网络大可能是都有一个上限

若是IP层有一个数据报要传,并且数据的长度比链路层的MTU还大,那么IP层就须要进行分片,把数据报分红若干片,这样每一片都小于MTU

点到点的链路层(如SLIP和PPP)的MTU并不是指的是网络媒体的物理特性。相反,它是一个逻辑限制,目的是为交互使用提供足够快的响应时间

IP:网际协议

在网络中,每台计算机都有一个惟一的地址,方便别人找到它,这个地址称为IP地址 IP是TCP/IP协议族中最为核心的协议,全部的TCP/UDP/ICMP及IGMP数据都以IP数据报格式传输

IP提供不可靠、无链接的数据报传送服务:

  • 不可靠( u n r e l i a b l e)指的是它不能保证 I P 数据报能成功地到达目的地。 IP提供最好的传输服务
  • 若是发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误吹算法:丢弃该数据报,而后发送ICMP消息报给信源端
  • 任何要求的可靠性必须由上层来提供(如TCP)
  • 无链接指的是IP并不维护任何关于后续数据报的状态信息。每一个数据报的处理是相互独立的
  • IP数据报能够不按顺序接收,若是一信源向相同的信宿发送两个连续的数据报(先是A而后是B),每一个数据报都是独立地进行路由选择,可能选择不一样的路线,所以B可能在A到达以前先到达

IP首部

普通的IP首部长为20个字节,除非含有选项字段 IP数据报格式及首部中的各字段,如图所示:

  • 最高位在左边,记为0bit,最低位在右边,记为31bit
  • 版本:目前的协议版本号是4,由于IP有时也称做IPV4
  • 首部长部:首部占32bit字的数目,包括任何选项。因为它是一个 4比特字段,所以 首部最长为60个字节
  • 服务类型:包括一个3bit的优先权子字段(如今已被忽略),4bit的TOS子字段和1bit未用位必须置0,4bit的TOS分别表明:最小时延、最大吞吐量、最高可靠性和最小费用,4bit中只能置其中1bit
  • 总长度:该字段用以指示整个IP数据包的长度,最长为65535字节,包括头和数据
  • 标识符:惟一标识主机发送的每一份数据报
  • 标志:分为3个字段,依次为保留位、不分片位和更多片位
    • 保留位:通常被置为0
    • 不分片位:表示该数据报是否被分片,若是被置为1,则不能对数据报进行分片,若是要对其进行分片处理,就应将其置为0
    • 更多片位:除了最后一个分片,其余每一个组成数据报的片都要将该位置设置为1.
  • 段偏移量:该分片相对于原始数据报开始处位置的偏移量
  • TTL(Time to Live生存时间):该字段用于表示IP数据包的生命周期,能够防止一个数据包在网络中无限循环地发下去。TTL的意思是一个数据包在被丢弃以前在网络中的最大周转时间。该数据包通过的每个路由器都会检查该字段中的值,当TTL的值为0时此数据包会被丢弃。TTL对应于一个数据包经过路由器的数目,一个数据包每通过一个路由器,TTL将减去1
  • 协议号:用以指示IP数据包中封装的是哪一个协议
  • 首部校验和:检验和是16位的错误检测字段。目的主机和网络中的每一个网关都要从新计算报头的校验和,若是首部在传输过程当中没有发生任何差错, 那么接收方计算的结果应该为全1,若是结果不是全1(即检验错误),那么IP久丢弃收到的数据报,可是不生成差错报文,由上层去发现数据并进行重传
  • 源IP地址:该字段用于表示数据包的源地址,指的是发送该数据包的设备的网络地址
  • 目标IP地址:该字段用于表示数据包的目标的地址,指的是接收节点的网络地址
  • 任选项:是数据报中的一个可变长的可选信息,选项字段一直都是以32bit做为接线,在必要时插入值为0填充字节,这样保证IP首部始终是32bit的整数倍

IP路由选择

大多数主机采用的IP路由选择机制:

  • 若是目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那IP数据报就直接送到目的主机上,不然主机把数据报发往一默认的路由器上,由路由器来转发该数据报

路由表中的每一项都包含下面这些信息:

  • 目的IP地址:它既能够是一个完整的主机地址,也能够是一个网络地址,由该表目中的标志字段来指定
  • 标志:其中一个标志指明目的IP地址是网络地址仍是主机地址,另外一个标志指明下一站路由器是否为真正的下一站路由器仍是一个直接相连的接口
  • 为数据报的传输指定一个网络接口

IP路由选择是逐跳地进行的,IP并不知道到达任何目的地的完整路径(除了那些鱼主机直接相连的目的),全部的IP路由选择只为数据报传输提供下一站路由器的IP地址,它假定下一站路由器比发送数据报的主机更接近目的,并且下一站路由器与该主机是直接相连的

IP路由选择主要完成如下这些功能:

    1. 搜索路由表,寻找能与目的IP地址彻底匹配的表目(网络号和主机号都要匹配) ,若是找到,则把报文发送给该表目指定的下一站路由器或直接链接的网络接口(取决于标志字段的值)
    1. 搜索路由表,寻找能与目的网络号相匹配的表目。若是找到,则把报文发送给该表目指定的下一站路由器或直接链接的网络接口(取决于标志字段的值)。目的网络上的全部主机均可以经过这个表目来处置
    1. 搜索路由表 , 寻找标为“默认(default )” 的表目。若是找到 , 则把报文发送给该表目指定的下一站路由器

若是上面这些步骤都没有成功,那么该数据报就不能被传送。若是不能传送的数据报来自本机,那么通常会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误

为一个网络指定一个路由器,而没必要为每一个主机指定一个路由器,这是IP路由选择机制的另外一个基本特性。这样作能够极大地缩小路由表的规模,好比Internet上的路由器有只有几千个表目,而不会是超过100万个表目

IP地址的分类

IP地址的网络部分是由Internet地址分配机构来统一分配的,这样能够保证IP的惟一性

  • ip地址中全为1的ip即255.255.255.255,它称为限制广播地址,若是将其做为数据包的目标地址能够理解为发送到全部网络的全部主机
  • ip地址中全为0的ip即0.0.0.0,它表示启动时的ip地址,其含义就是还没有未分配时的ip地址
  • 127是用来进行本机测试的,除了127.255.255.255外,其它的127开头的地址都表明本机

如图所示,红色为网络部分,绿色为主机部分

子网寻址

如今全部的主机都要求支持子网编址

  • 若是把IP当作单纯的一个网络号和一个主机号组成,A类和B类地址为主机号分配了太多的空间,可容纳的主机数分别为 2^24-2 和 2^16-2(除了全 0 和全 1),然而一个网络中人们并不安排这么多的主机
  • 如今把主机号再分红一个子网号和一个主机号,如对一个 B 类地址,前 16 位为网络号,将后 16 位主机号拆分为 8 位子网号和 8 为主机号。子网对外部路由器来讲隐藏了内部网络组织(校园或公司内部)的细节。这样外部路由器仅须要知道下一跳路由的子网号,而无需知道具体的主机号,能够大大缩减路由表的规模

子网掩码

子网掩码(subnet mask)又叫子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机位的掩码。 子网掩码不能单独存在,它必须结合IP地址一块儿使用。 子网掩码只有一个做用,就是将某个IP地址划分红网络地址和主机地址两部分

  • 子网掩码也是32个二进制位
  • 对应IP的网络部分用1表示
  • 对应IP地址的主机部分用0表示
  • IP地址和子网掩码作逻辑与运算获得网络地址
    • 0和任何数相与都是0
    • 1和任何数相与都等于任何数自己

两种不一样的B类地址子网掩码的例子,如图:

A B C 三类地址都有本身默认的子网掩码

  • A类 255.0.0.0
  • B类 255.255.0.0
  • C类 255.255.255.0

给定IP地址和子网掩码后,主机就能够肯定IP数据报的目的是:

  • 本子网上的主机
  • 本网络中其余子网中的主机
  • 其余网络上的主机

TCP:传输控制协议

TCP提供一种面向链接的、可靠的字节流服务 TCP提供全双工服务,即数据可在同一时间双向传播

面向链接指的是两个使用TCP的应用(一般是客户端和服务端)在彼此交换数据以前必须先创建一个TCP链接,保证双向的接收和发送都是正常的

TCP经过下列方式来提供可靠性:

  • 应用数据被分割成TCP认为最适合发送的数据块,由TCP传递给IP的信息单位成为报文段或段(Segment)
  • 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,若是不能及时收到一个确认,将重发这个报文段
  • 当TCP收到发自TCP链接另外一端的数据,它将发送一个确认,这个确认不是当即发送,一般将推迟几分之一秒
  • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程当中的任何变化。若是收到段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(但愿发端超时并重发)
  • 既然TCP报文段做为IP数据报来传输,而IP数据报的到达可能会失序,所以TCP报文段的到达也可能会失序,若是必要,TCP将对收到的数据进行从新排序,将收到的数据以正确的顺序交给应用层
  • 既然IP数据报会发生重复, TCP的接收端必须丢弃重复的数据
  • TCP还能提供流量控制。TCP链接的每一方都有固定大小的缓冲空间,TCP的接收端只容许另外一端发送接收端缓冲区所能接纳的数据,这将方式较快主机导致较慢主机的缓冲区溢出

TCP数据包封装

源端口号和目标端口号,计算机经过端口号识别访问哪一个服务,好比http服务或ftp服务,发送方端口号是进行随机端口,目标端口号决定了接收方哪一个程序来接收

  • 源端口号:发送TCP进程对应的端口号
  • 目标端口号:目标端接收进程的端口号

32位序列号:0~2^32-1范围内,32位序列号 TCP用序列号对数据包进行标记,以便在到达目的地后从新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在创建链接时一般由计算机生成一个随机数做为序列号的初始值

32位确认号:0~2^32-1范围内,对发送端的确认信息,告诉发送端这个序号以前的数据段都收到了。确认应答号,它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,能够认为这个位置之前全部的数据都已被正常接收

首部长度:TCP 首部的长度,单位为 4 字节。若是没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节

控制位:TCP的链接、传输和断开都受这六个控制位的指挥

  • PSH(push急迫位) 缓存区将满,马上传输速度
  • RST(reset重置位) 链接断了从新链接
  • URG(urgent紧急位) 紧急信号。只在 URG(urgent紧急) 控制位为 1 时有效。表示紧急数据的末尾在 TCP 数据部分中的位置。一般在暂时中断通讯时使用(好比输入 Ctrl + C)
  • ACK(acknowledgement 确认)为1表示确认号。确认序列号有效位,代表该数据包包含确认信息
  • SYN(synchronous创建联机) 同步序号位 TCP创建链接时要将这个值设为1,为1时,请求创建链接
  • FIN发送端完成位,提出断开链接的一方把FIN置为1表示要断开链接,为1时,数据报送完毕,请求断开链接

窗口值:说明本地可接收数据段的数目,这个值的大小是可变的。当网络通畅时将这个窗口值变大加快传输速度,当网络不稳定时减小这个值能够保证网络数据的可靠传输。它是来在TCP传输中进行流量控制的

窗口大小:用于表示从应答号开始可以接受多少个 8 位字节。若是窗口大小为 0,能够发送窗口探测

16位校验和:主要用来实现差错控制的,TCP校验和的计算包括TCP首部、数据和其它填充字节。在发送TCP数据段时,由发送端计算校验和,当到达目的地时又进行一次检验和计算。若是两次校验 和一致说明数据是正确的,不然 将认为数据被破坏,接收端将丢弃该数据

TCP的三次握手

为了创建一条TCP链接,通过如下过程:

  • 第一次握手主机A经过一个标识为SYN标识位的数据段发送给主机B请求链接,经过该数据段告诉主机B但愿创建链接,须要B应答,并告诉主机B传输的起始序列号
  • 第二次握手是主机B用一个确认应答ACK和同步序列号SYNC标志位的数据段来响应主机A,一是发送ACK告诉主机A收到了数据段,二是通知主机A从哪一个序列号作标记。
  • 第三次握手是主机A确认收到了主机B的数据段并能够开始传输实际数据。

这三个报文段完成链接的创建,这个过程也称为三次握手

TCP的四次挥手

创建一个链接须要三次握手,而终止一个链接要通过 4次握手,这是TCP的半关闭形成的

  • 一个TCP链接是全双工(即数据在两个方向上能同时传递),所以每一个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接,当一端收到一个FIN,它必须通知应用层另外一端已经终止了那个方向的数据传送,发送FIN一般是应用层进行关闭的结果
  • 收到一个FIN只意味着在这一方向上没有数据流动。一个TCP 链接在收到一个FIN后仍能发送数据
  • 首先进行关闭的一方(即发送第一个FIN )将执行主动关闭,而另外一方(收到这个FIN) 执行被动关闭。一般一方完成主动关闭而另外一方完成被动关闭

  • 客户端发送FIN控制位发出断开链接的请求,用来关闭从客户端到服务器的数据传送
  • 当服务器收到这个FIN ,它发回一个ACK ,确认序号为收到的序号加 1 。和SYN 同样,一个FIN将占用一个序号
  • TCP服务器还向应用程序 (即丢弃服务器)传送一个文件结束符,接着这个服务器程序就关闭它的链接
  • 客户端确认收到服务器的关闭链接请求,发回一个确认,并将确认序号设置为收到序号加1

这样就终止一个链接的典型握手顺序,图中,发送FIN将致使应用程序关闭它们的连接,这些FIN和ACK是由TCP软件自动产生的

链接一般是由客户端发起的,这样第一个SYN从客户端传到服务器,每一端都能主动关闭这个链接(即首先发送FIN),通常是由客户端决定什么时候终止链接,由于客户进程一般由用户交互控制

UDP:用户数据报协议

UDP是一个无链接、不保证可靠性的传输层协议,也就是说发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉 发送方是否收到了数据,它的可靠性由上层协议来保障

首部结构简单,在数据传输时能实现最小的开销,若是进程想发送很短的报文而对可靠性要求不高可使用

UDP首部

端口号表示发送进程和接收进程

UDP长度:指的是UDP首部和UDP数据的字节长度,该字段最小值为8字节,包含数据的长度,能够算出数据的结束位置

UDP校验和:覆盖UDP首部和UDP数据,UDP的差错控制(可选)

  • 若是检验和的计算结果为0,则存入的值全为1(65535),这在二进制反码计算中是等效的。若是传送的检验和为0,说明发送端没有计算检验和
  • 若是发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样作)
  • UDP检验和是一个端到端的检验和。它由发送端计算,而后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生任何改动