【TCP】TCP协议详解--研读---未完
2、网络设备
2.1网卡
每一网卡都有唯一的编号,这个号码叫做MAC地址,其功能主要有两个,一是将计算机的数据进行封装,通过通信线路发布到网上。二是接收网络上传来的数据,传到计算机中。
2.2 交换机
交换机与集线器一样,但性能却优于集线器。1000Mb/s的交换机的每个端口都是1000Mb/s,互联的每台计算机均以1000Mb/s进行通信,而不像集线器那样平分带宽。交换机的工作原理:交换机从某一节点收到一个以太网帧后,便在其内存中地址表进行查找(MAC地址),如果有就将数据传输到该地址,如果没有就将该数据包广播到所有节点,与此匹配的MAC地址收到后就会做出应答,最后交换机就可以将这个地址保存到MAC地址表。
2.2 路由器
路由器主要连接不同网络,所谓路由功能指的是在不同网络之间选择最佳的信息传输路径,从而使信息更快的传输到目的地。
2、OSI 七层模型
2.2具体各层介绍
物理层:定义物理设备标准,比如网线的接口类型,光纤的接口类型,传输介质的传输速率。主要作用是传输数据流
数据链路层:定义如何让格式化数据传输,如何控制对物理层的访问。 其主要功能是如何在不可靠的物理线路上进行数据的可靠传递。保证传输的可靠性。
数据链路层主要设备:二层交换机、网桥、网卡
网络层:给两个不同的主系统提供链接和路径选择。
网络层主要设备:路由器
传输层:定义传输数据的协议和端口号(www协议,使用80端口),TCP(传输控制协议),UDP(用户数据报协议)
会话层:认为是一次通讯的过程,通过传输层建立数据传输的通路(设备的连接可以是IP或者MAC或者主机名)
表示层:这一层确保一个系统的应用层所发出的信息可以被另一个系统接收。两个系统之间可能传输和接收数据的格式不一样,需要表示层来进行数据格式转换。
应用层:用户的应用程序,应用层协议的代表包括:Telnet、FTP、HTTP、SNMP、DNS等。
2.3 每一层的数据变化
3、TCP/IP四层模型
OSI七层模型是一个参考模型,真正使用的是TCP/IP模型。TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 http、ftp、pop3、https 协议等。网络中的计算机都采用这套协议族进行互联。
模型对应图:
3.1 每一层负责的功能
链路层:链路层也叫网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。
网络层:也叫互联网层,处理分组的网络活动。TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(互联网控制报文协议),以及IGMP协议(internet组管理协议)
运输层:主要为两个主机的应用程序提供端到端的通信。TCP/IP协议族中,有两个互不相同的协议TCP协议,UDP协议。
应用层:负责处理特定的应用程序细节。应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。
3. 2 基于TCP/IP协议族的主机间通讯协议过程
TCP和UDP是两种最为著名的运输协议,二者都使用IP作为网络层协议。IP是网络层上的主要协议,ICMP是IP协议的附属协议,IP层用它来与其他主机或者路由器交换错误报文和其他重要信息,IGMP是internet组管理协议,它用来把一个UDP数据报播到多个主机。ARP(地址解析协议)和RAPP(逆地址解析协议)是某些网络接口(如以太网,令牌环网)使用的特许协议,用来转换IP层和网络接口层协议。
3.3 TCP/IP数据包封装
传输层TCP传给网络层IP的数据单元称作TCP报文段,TCP段。IP传给接口层的数据单元称作IP数据段。
3.3 TCP/IP数据包分发
主机收到一个数据包时,数据就开始从协议栈中由底层向上升,同时去掉各层协议加上的报文首部,每层协议盒都要检查报文首部中的协议标识,以确定接收数据的上层协议,这个过程叫做分用。
4、IP协议概述
IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要注意的是,IP提供不可靠、无连接的数据传送,赖其他层的协议进行差错控制。不可靠指的是IP数据报不保证能成功的到达目的地,如果出现错误则选择丢弃该数据,然后发送ICMP消息报给信源端。无连接指的是IP不提供任何后续数据报的状态信息,每个数据报处理都是独立的。如果一个信源发送了连续的两个数据报,每个数据报选择独立的路由,两个数据可能不同时到达。
4.1 IP协议消息头
(1) 版本号:IP协议的版本。对于IPv4来说值是4
(2) 头部长度:4位最大为0xF,注意该字段表示单位是字(4字节)
(3) 服务类型(Type Of Service,TOS):3位优先权字段(现已被忽略) + 4位TOS字段 + 1位保留字段(须为0)。4位TOS字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个能置为1。应用程序根据实际需要来设置 TOS值,如ssh和telnet这样的登录程序需要的是最小延时的服务,文件传输ftp需要的是最大吞吐量的服务。
(4) 总长度: 指整个IP数据报的长度,单位为字节,即IP数据报的最大长度为65535字节(2的16次方)。利用首部长度字段和总长度字段,就可以知道IP数据报中的数据内容的启始位置和长度。
(5) 标识:唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值
(6) 标志: 位1保留,位2表禁止分片(DF),若设置了此位,IP模块将不对数据报进行分片,在此情况下若IP数据报超过MTU,IP模块将丢弃数据报并返回一个ICMP差错报文;位3标识更多分片(MF),除了数据报的最后一个分片,其他分片都要把它设置为1
(7) 位偏移:分片相对原始IP数据报数据部分的偏移。实际的偏移值为该值左移3位后得到的,所以除了最后一个IP数据报分片外,每个IP分片的数据部分的长度都必须是8的整数倍
(8) 生存时间(TTL)::数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置,常设置为64。数据报在转发过程中每经过一个路由该值就被路由器减1.当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。
(9) 协议: 区分IP协议上的上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段,ICMP为1,TCP为6,UDP为17
(10) 首部校验和: 由发送端填充接收端对其使用CRC算法校验,检查IP数据报头部在传输过程中是否损坏
(11) 源IP地址和目的IP地址: 表示数据报的发送端和接收端。一般情况下这两个地址在整个数据报传递过程中保持不变,不论中间经过多少个路由器
(12) 选项:可变长的可选信息,最多包含40字节。选项字段很少被使用。可用的IP可选项有:
a. 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径
b. 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间
c. 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器
d. 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器
e. 上层协议(如TCP/UDP)的头部信息
4.2 IP路由选择
IP层在内存中有一个路由表,当收到一份数据报时并进行发送时,它都要对该表进行搜索一次,当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机IP地址之一或者IP广播地址。如果是这样,数据就被送到IP首部协议字段所指的协议模块进行处理。如果不是,有路由功能时就进行转发,要么就丢弃。
4.2 IP地址介绍
1)IP地址是32位二进制数,每八个为一段,共四段,10000011.01101011.00010000.11001000,转换成十进制就是130.107.16.200
2)IP地址由网络ID和主机ID组成,网络ID表明所在网络的编号,主机ID表明计算机的编号。
3)IP地址分为A、B、C、D、E五类
也就是说,分为以下几类:
A: 0.0.0.0-127.255.255,其中段0和127不可用
B: 128.0.0.0-191.255.255.255
C: 192.0.0.0-223.255.255.255
D: 224.0.0.0-239.255.255.255
E: 240.0.0.0-255.255.255.255,其中段255不可用
这其中除了段0和段127之外,还有一些IP地址因为有其他的用途,是不可以用作普通IP的。还有一部分被用作私有IP地址。
4.2 子网掩码
计算机联网时必须有公有IP地址,除了IP地址外主机还需要知道多少比特用于子网掩码,以及多少用于主机号,子网掩码是一个32bit值,值为1的比特留给网络号和子网号,为0的比特留给主机号。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
4.3 域名地址(DNS)
由解析器和域名服务器组成。域名服务器是指保存有该网络中所有主机域名和对应IP地址,并具有将域名转换成IP地址功能的服务器。域名解析是指将域名映射为IP地址
5.1 TCP服务
TCP将用户数据打包构成报文段,它发送数据时启动一个定时器,另一端收到数据进行确认,对失序的数据重新排序,丢弃重复的数据。TCP提供一种面向连接的可靠的字节流服务,面向连接意味着两个使用TCP的应用(B/S)在彼此交换数据之前,必须先建立一个TCP连接,类似于打电话过程,先拨号振铃,等待对方说喂
,然后应答。在一个TCP连接中,只有两方彼此通信。
TCP可靠性来自于:
(1)应用数据被分成TCP最合适的发送数据块
(2)当TCP发送一个段之后,启动一个定时器,等待目的点确认收到报文,如果不能及时收到一个确认,将重发这个报文。
(3)当TCP收到连接端发来的数据,就会推迟几分之一秒发送一个确认。
(4)TCP将保持它首部和数据的检验和,这是一个端对端的检验和,目的在于检测数据在传输过程中是否发生变化。(有错误,就不确认,发送端就会重发)
(5)TCP是以IP报文来传送,IP数据是无序的,TCP收到所有数据后进行排序,再交给应用层
(6)IP数据报会重复,所以TCP会去重
(7)TCP能提供流量控制,TCP连接的每一个地方都有固定的缓冲空间。TCP的接收端只允许另一端发送缓存区能接纳的数据。
(8)TCP对字节流不做任何解释,对字节流的解释由TCP连接的双方应用层解释。
5.2 TCP消息
TCP数据是封装在一个IP数据中。
5.2.1 TCP消息头
●源、目标端口号字段:占16比特。TCP协议通过使用”端口”来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在”众所周知的端口”(Well-Know Port)为用户提供服务。
●顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。
●头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。
●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:
◆URG:紧急指针(urgent pointer)有效。
◆ACK:为1时,确认序号有效。
◆PSH:为1时,接收方应该尽快将这个报文段交给应用层。
◆RST:为1时,重建连接。
◆SYN:为1时,同步程序,发起一个连接。
◆FIN:为1时,发送端完成任务,释放一个连接。
●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。
●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
●选项字段:占32比特。可能包括”窗口扩大因子”、”时间戳”等选项。
5.3 TCP建立三次连接的过程(三次握手)
TCP是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接,建立一条连接有以下过程。
1、请求端(客户端)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序列号(ISN),这个SYN为报文段1.
2、服务器发回包含服务器的初始序列号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个字符。
3、客户必须将明确序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)
4、这三个报文段完成连接的建立,这个过程成为三次握手。
5.3 TCP终止连接过程(四次挥手)
1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
3、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
4、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。