一、TCP/IP协议
1、介绍
Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议等组成(当然还有其他后来发展起来的网络协议,还包括 ARP,ICMP,IGMP,UDP,以及让域名访问成为可能的DNS,以及电脑/手机可以自动获取IP地址的DHCP。当然还有形形色色的应用层的协议如 HTTP / SMTP / FTP 等。)。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
2、TCP/IP协议的发展历程
(以下内容来自百度百科):
为了减少网络设计的复杂性,大多数网络都采用分层结构。而TCP/IP协议采用了4层的层级结构。
在阿帕网(ARPA)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容。在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。当时美国的状况是,陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑,每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。
当时科学家们提出这样一个理念:“所有电脑生来都是平等的。”为了让这些“生来平等”的电脑能够实现“资源共享”就得在这些系统的标准之上,建立一种大家共同都必须遵守的标准,这样才能让不同的电脑按照一定的规则进行“谈判”,并且在谈判之后能“握手”。
在确定今天因特网各个电脑之间“谈判规则”过程中,最重要的人物当数瑟夫(Vinton G.Cerf)。正是他的努力,才使今天各种不同的电脑能按照协议上网互联。瑟夫也因此获得了与克莱因罗克(“因特网之父”)一样的美称“互联网之父”。
瑟夫从小喜欢标新立异,坚强而又热情。中学读书时,就被允许使用加州大学洛杉矶分校的电脑,他认为“为电脑编程序是个非常激动人心的事,......只要把程序编好,就可以让电脑做任何事情。”1965年,瑟夫从斯坦福大学毕业到IBM的一家公司当系统工程师,工作没多久,瑟夫就觉得知识不够用,于是到加州大学洛杉矶分校攻读博士,那时,正逢阿帕网的建立,“接口信号处理机”(IMP)的研试及网络测评中心的建立,瑟夫也成了著名科学家克莱因罗克手下的一位学生。瑟夫与另外三位年轻人(温菲尔德、克罗克、布雷登)参与了阿帕网的第一个节点的联接。此后不久,BBN公司对工作中各种情况发展有很强判断能力、被公认阿帕网建成作出巨大贡献的鲍伯·卡恩(Bob Kahn)也来到了加州大学洛杉矶分校。在那段日子里,往往是卡恩提出需要什么软件,而瑟夫则通宵达旦地把符合要求的软件给编出来,然后他们一起测试这些软件,直至能正常运行。
当时的主要格局是这样的,罗伯茨提出网络思想设计网络布局,卡恩设计阿帕网总体结构,克莱因罗克负责网络测评系统,还有众多的科学家、研究生参与研究、试验。69年9月阿帕网诞生、运行后,才发现各个IMP连接的时候,需要考虑用各种电脑都认可的信号来打开通信管道,数据通过后还要关闭通道。否则这些IMP不会知道什么时候应该接收信号,什么时候该结束,这就是我们所说的通信“协议”的概念。1970年12月制定出来了最初的通信协议由卡恩开发、瑟夫参与的“网络控制协议”(NCP),但要真正建立一个共同的标准很不容易,72年10月国际电脑通信大会结束后,科学家们都在为此而努力。
“包切换”理论为网络之间的联接方式提供了理论基础。卡恩在自己研究的基础上,认识到只有深入理解各种操作系统的细节才能建立一种对各种操作系统普适的协议,73年卡恩请瑟夫一起考虑这个协议的各个细节,他们这次合作的结果产生了在开放系统下的所有网民和网管人员都在使用的“传输控制协议”(TCP,Transmission-Control Protocol)和“因特网协议”(IP,Internet Protocol)即TCP/IP协议。
通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。1974年12月,卡恩、瑟夫的第一份TCP协议详细说明正式发表。当时美国国防部与三个科学家小组签定了完成TCP/IP的协议,结果由瑟夫领衔的小组捷足先登,首先制定出了通过详细定义的TCP/IP协议标准。当时作了一个试验,将信息包通过点对点的卫星网络,再通过陆地电缆,再通过卫星网络,再由地面传输,贯串欧洲和美国,经过各种电脑系统,全程9.4万公里竟然没有丢失一个数据位,远距离的可靠数据传输证明了TCP/IP协议的成功。
1983年1月1日,运行较长时期曾被人们习惯了的NCP被停止使用,TCP/IP协议作为因特网上所有主机间的共同协议,从此以后被作为一种必须遵守的规则被肯定和应用。2005年9月9日卡恩和瑟夫由于他们对于美国文化做出的卓越贡献被授予总统自由勋章。
3、TCP/IP四层模型
二、IP协议
1、介绍
IP协议(Internet Protocol)是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。IP协议在OSI参考模型中应用于网络层,以“数据包(Package)”为单位。其中,IP地址的定义是确认唯一端口号和路由选择的关键,IP地址相当于每台电话的电话号码,唯一且是我们互相联系的关键,因此IP协议也是网络互连的关键。
2、IP协议特点
- ①IP协议是一种无连接、不可靠的分组传送服务的协议。
- ②IP协议是点-点线路的网络层通信协议。IP协议是针对原主机-路由器、路由器-路由器、路由器-目的主机之间的数据传输的点-点线路的网络层通信协议。
- ③IP协议屏蔽了网络在数据链路层、物理层协议与实现技术上的差异。:通过IP协议,网络层向传输层提供的是统一的IP分组,传输层不需要考虑互联网在数据链路层、物理层协议与实现技术上的差异,IP协议使得异构网络的互联变得容易了。
3、IPV4和IPV6
目前,主流IP是基于IPv4的,但IPV4网络难以实现网络实名制,一个重要原因就是因为IP资源的共用,因为IP资源不够(IPV4为32位),所以不同的人在不同的时间段共用一个IP,IP和上网用户无法实现一一对应。而IPv6(128位,足够长)的普及将改变现状,因为IPv6一个重要的应用将是实现网络实名制下的互联网身份证/VIeID,在IPv4下,现在根据IP查人也比较麻烦,电信局要保留一段时间的上网日志才行,通常因为数据量很大,运营商只保留三个月左右的上网日志,比如查前年某个IP发帖子的用户就不能实现。IPv6的出现可以从技术上一劳永逸地解决实名制这个问题,因为那时IP资源将不再紧张,运营商有足够多的IP资源,那时候,运营商在受理入网申请的时候,可以直接给该用户分配一个固定IP地址,这样实际就实现了实名制,也就是一个真实用户和一个IP地址的一一对应。当一个上网用户的IP固定了之后,你任何时间做的任何事情都和一个唯一IP绑定,你在网络上做的任何事情在任何时间段内都有据可查,并且无法否认。因此你可能昨晚刚浏览过非法网站后,第二天早上就会有人上门给你开罚款单(啧啧)。
IPv4,是互联网协议(Internet Protocol,IP)的第四版,也是第一个被广泛使用,构成现今互联网技术的基础的协议。1981年 Jon Postel 在RFC791中定义了IP,Ipv4可以运行在各种各样的底层网络上,比如端对端的串行数据链路(PPP协议和SLIP协议) ,卫星链路等等。局域网中最常用的是以太网。目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中网络层的协议,是TCP/IP协议族的核心协议之一。目前IP协议的版本号是4(简称为IPv4,v,version版本),它的下一个版本就是IPv6。
数据报格式如下:首部的长度是以4个字节为单位,长度可以是20-60字节,这跟首部的HLEN字段有关。
- 首部长度:这个4位字段定义了数据报首部的长度,以4字节的字为单位。当首部没有选项时,首部长度位20字节;当这个字段值位最大值F时,首部长度最大为60字节。
- 服务类型:在最初这个字段有一部分用于定义数据报的优先级,剩下的一部分定义了服务类型。IETF已经改变了这个8位字段的解释,现在定义了一组区分服务。在这种解释种,前6位构成了码点(codepoint),最后两位未使用。当码点字段最右边的3位不全为0时,这6位定义了54种服务,低延时,高吞吐量等等。
- 总长度:这个16位字段定义了数据报总长度,其以字节为单位。故IPv4数据报总长度上限值位65536字节。注:为什么需要这个字段?在许多情况下,我们确实不需要这个字段值。但是有些情况下,封装在一个帧里的并不仅仅是数据报,还可能附加了一些填充。比如,以太网协议对帧的数据有最大值(1500字节)和最小值(46字节)的限制,当数据小于46字节时,数据将含有填充数据。
- 标识(identification): 这个16位字段标志了从源主机发出的一个数据报,这样就确定了数据报的唯一性。这样使得数据报被分片后,在到达终点时终点能根据标识号将同一个数据报的分片重新组装成一个数据报。
- 标志(flag):第一位保留(未用),第二位为“不分片(do not fragment)”,第三位位“还有分片(more fragment)”。
- 分片偏移:这个13位字段表示的是分片在整个数据报中的相对位置。这是数据在原始数据报中的偏移量,以8字节位单位。
- 生存时间:这个8位字段用来控制数据报所经过的最大跳数(路由器),每经过一个路由器,这个字段数值都减1,减1后变位0时,路由器就丢弃这个数据报。
- 协议:这个8位字段定义了使用IPv4服务的高层协议,如TCP,UDP,ICMP,IGMP,OSPF等的数据都将被封装到IP数据报中。这个字段指明数据报必须交付给哪个最终目的协议。
- 检验和:检验IP数据报首部。
- 源地址:定义了源点的IP地址,这个字段始终保持不变。
- 目的地址:定义了终点的IP地址,这个字段始终保持不变。
IPV4地址格式:
IPv4中规定IP地址长度为32(按TCP/IP参考模型划分) ,即有2^32-1个地址。 ipv4所存在的问题 一般的书写法为4个用小数点分开的十进制数。也有人把4位数字化成一个十进制长整数,但这种标示法并不常见。另一方面,IPv6使用的128位地址所采用的位址记数法,在IPv4也有人用,但使用范围更少。 过去IANAIP地址分为A,B,C,D 4类,把32位的地址分为两个部分:前面的部分代表网络地址,由IANA分配,后面部分代表局域网地址。如在C类网络中,前24位为网络地址,后8位为局域网地址,可提供254个设备地址(因为有两个地址不能为网络设备使用: 255为广播地址,0代表此网络本身) 。网络掩码(Netmask) 限制了网络的范围,1代表网络部分,0代表设备地址部分,例如C类地址常用的网络掩码为255.255.255.0。
IPV6:
由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。IPV6号称可以为全世界的每一粒沙子编上一个网址。
发展历史:2003年1月22日,IETF发布了IPv6测试性网络。最初开始于虚拟网络,它使用IPv6-over-IPv4隧道过渡技术。因此,它是一个基于IPv4互联网且支持IPv6传输的网络,后来逐渐建立了纯IPv6链接。从2011年开始,主要用在个人计算机和服务器系统上的操作系统基本上都支持高质量IPv6配置产品。例如,Microsoft Windows从Windows 2000起就开始支持IPv6,到Windows XP时已经进入了产品完备阶段。一些应用基于IPv6实现.如BitTorrent点到点文件传输协议等,避免了使用NAT的IPv4私有网络无法正常使用的普遍问题。2012年6月6日,国际互联网协会举行了世界IPv6启动纪念日,这一天,全球IPv6网络正式启动。多家知名网站,如Google、Facebook和Yahoo等,于当天全球标准时间0点(北京时间8点整)开始永久性支持IPv6访问。
IPV6地址格式:
IPv6的地址长度为128b,是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用,采用十六进制表示。IPv6有3种表示方法。
- 冒分十六进制表示法:
格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,例如:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,这种表示法中,每个X的前导0是可以省略的,例如:2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A。 - 0位压缩表示法:
在某些情况下,一个IPv6地址中问可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:
FF01:0:0:0:0:0:0:1101 → FF01::1101
0:0:0:0:0:0:0:1 → ::1
0:0:0:0:0:0:0:0 → :: - 内嵌IPv4地址表示法:
为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.0.1与::FFFF:192.168.0.1就是两个典型的例子,注意在前96b中,压缩0位的方法依旧适用。
IPV6报文格式:
三、TCP协议
1、介绍
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的, 基于IP的传输层协议。TCP在IP报文的协议号是6。TCP是一个超级麻烦的协议,而它又是互联网的基础。下面是OSI七层模型图:
TCP工作在网络OSI的七层模型中的第四层——Transport层(传输层),IP在第三层——Network层,ARP 在第二层——Data Link层。在第二层的数据,我们把它叫Frame(数据帧),在第三层的数据叫Packet(数据包),第四层的数据叫Segment(数据段)。 同时,我们需要简单的知道,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端。所以数据的发送和接收其实就是数据的封装和解封装的过程。
2、TCP报文格式
如上图所示,TCP数据格式是由若干具有特殊含义字段组成的。其中,
- Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号;用于区别主机中的不同进程, 而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一 的确定一个TCP连接;
- Sequence Number:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据 字节在数据流中的序号;主要用来解决网络报乱序的问题;
- Acknowledgment Number:32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应 当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字 段才有效。主要用来解决不丢包的问题;
- Offset:给出首部中32 bit字的数目,需要这个值是因为任选字段的长度是可变的。这个字段占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的三次握手; - Window:窗口大小,也就是有名的滑动窗口,用来进行流量控制。这是一个复杂的问题,本文不再论述。
2、TCP协议的三次握手
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。如下图TCP的通信过程所示:
三次握手具体过程(状态)如下(其实可以类比打电话的过程:甲打电话,并等待接听→乙收到来电显示,“并表示可以接听”→“甲收到乙可以接听的信息”,甲接听电话。注:引号部分是打电话过程中没有的,但在TCP三次握手中存在):
-
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。(客户的建立连接并等待确认)
-
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。(服务器端发送相关报文段信息并等待连接)
-
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。(客户的接收到服务端信息并实现连接)
然后,客户端和服务端就能实现正常的数据传输啦!
3、TCP协议的四次分手
既然握手都需要频繁确认,那么“分手”又怎能马虎呢?具体过程(状态)如下(同样也可以看做挂电话的过程:我说完了,挂?→我也说完了,挂吧?→好,拜拜→bye。简言之就是确认通信双方都交流完毕再确认断开连接):
- 第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了。(一方数据发送完成)
- 第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了。(另一方数据发送完成)
- 第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态。(请求关闭连接并等待)
- 第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。(关闭连接)
现在,我们也应该理解为什么TCP协议是面向连接的、可靠的、基于IP协议的“通信控制协议”了。TCP的三次握手保证了数据的可靠性,保证资源不被浪费,而四次分手保证连接的可靠性而不至于随意断开连接,但TCP协议也由其可靠性,数据传输效率变得较低,而不像UDP那样进行实时快速传输,下文我们就来学习什么是UDP协议。