TCP/IP协议
TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。 TCP/IP协议参考模型:
- 分为四个层次:数据链路层
TCPIP协议 | 描述 |
---|---|
应用层 | HTTP FTP |
传输层 | TCP UDP |
网络层 | IP协议:负责对数据加上IP地址和其他的数据以确定传输的目标 |
数据链路层 | 为待传的数据加入一个以太网协议头,并进行CRC编码,为数据传输做准备 |
TCP/IP协议通信过程:
对应着数据入栈和出栈的过程。 入栈:数据发送方每层不断的封装首部和尾部,添加一些传输的信息,确保能传输到目的地。 出栈:数据接收方每层不断地拆除首部与尾部,得到最终传输的数据。
数据链路层
原理:物理层负责0,1比特流与物理设备电压高低、光的闪灭之间的互换。 详解:数据链路层负责将0,1序列划分为数据帧从一个节点传输到临近的另一个节点,这些节点是通过MAC来唯一标识的。 功能:
- 封装成帧:把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址
- 透明传输:指不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。
- 可靠传输:采用一系列技术来保障信息在发送方和接收方准确、精确的传输。在出错率很低的链路上很少用,但是无线链路WLAN会保证可靠传输
- 差错检测(CRC): 接收者检测错误,如果发现差错,丢弃该帧。
网络层
IP协议:
所有的TCP、UDP、IMCP、IGMP的数据都以IP数据格式传输。 注意:IP是不可靠协议,即,IP协议没有提供一种数据未传达以后的处理机制,而是让上层协议TCP或UDP处理。
IP地址划分: 数据链路层中是通过MAC地址识别不同节点,在IP层的地址标识是IP地址。
32位IP地址 = 网络号 + 地址位 这样划分的目的:减少路由器中路由表记录的数目 网络地址:可以限定拥有相同网络地址的终端在同一个范围内,路由器只需要维护一条这个网络地址的方向就可以找到其终端了。 IP分类:
- A类IP地址: 0.0.0.0 ~ 127.255.255.255
- B类IP地址: 128.0.0.0 ~ 191.255.255.255
- C类IP地址: 192.0.0.0 ~ 239.255.255.255
- D类IP地址:
IP数据报的完整格式 一个IP数据报有首部和数据两部分组成。首部前一部分是固定长度,20字节;可选字段的长度是可变的
ARP及RARP协议
ARP:地址解析协议,根据IP地址获取MAC地址的一种协议 主机是不知道这个ip对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(IP-MAC地址对应表缓存) 如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机。
而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。
RARP协议的工作与此相反,不做赘述。
IPMP协议
IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。ICMP不是高层协议,而是IP层的协议。
当传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。
PING
ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
Traceroute
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。
Traceroute的原理是非常非常的有意思,它收到到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP。
DNS
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
运输层协议
进程之间的通信 网络的边缘部分的两个主机使用网络的核心部分的功能进行端到端通信时,只有主机的协议栈才有运输层,网络核心部分中的路由器在转发分组时只用到下三层的功能 端到端的通信是应用进程之间的通信。 运输层的作用 复用(multiplexing):指在发送方不同的应用进程都可以使用同一个运输层协议传送数据 分用(demultiplexing):指接收方的运输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程 运输层和网络层区别 网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信; 运输层要对收到的报文进行差错检测
运输层两个协议主要的协议:TCP、UDP
UDP协议
- 用户数据报协议UDP(User Datagram Protocol) 主要应用:DNS/TFTP/RIP/BOOTP/DHCP/SNMP/NFS/IGMP
- 特点:
- 无连接
- 使用尽最大努力交付(即,不保证可靠交付)
- 面向报文:应用层交给UDP多长的报文,UDP就照样发送,既不合并也不拆分 若报文太长,IP层传送时要进行分片。因此应用进程要选择合适大小的报文
- UDP首部开销小,只有8字节,比TCP的20字节要短
- UDP数据包组成:数据字段、首部字段 首部字段共8字节:源端口、目的端口、长度、检验和
- 端口不可达 如果接收方UDP发现报文中的目的端口号不正确(不存在对应于该端口号的应用进程),就丢弃该报文并由ICMP发送端口不可达差错报文给发送方
- 伪首部:只有在计算检验和时,临时添加在UDP用户数据报前面的数据,由此计算检验和。伪首部既不向下传送,也不向上递交。
TCP协议
- 应用:SMTP/TELNET/HTTP/FTP
- 特点: 1.面向连接的运输层协议 2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的 3.TCP提供可靠交付的服务 4.提供全双工通信 5.面向字节流:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
- TCP根据对方给出的窗口值和当前网络拥塞程度来决定一个报文段应包含多少个字节
- TCP连接的端点是套接字,即(IP地址:端口号)
- 停止等待协议 “超时重传”:A只要超过一段时间没有收到确认,就认为刚才发送的分组丢失了,因而重传签名发送过的分组。 需要设置超时计时器 对于迟到的确认,B会(1)丢弃这个重复的分组M2,不向上层交付。(2)向A发送确认 缺点:信道利用率太低
- 连续ARQ协议 定义:发送方每收到一个确认,就把发送窗口向前滑行一个分组的位置。接收方一般都采用累计确认的方式。 即:接收方在收到几个分组后,对按序到达的最后一个分组发送确认。表示到这个分组为止的所有分组都已经正确收到了。
- TCP报文格式
三次握手
TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。
具体流程:
1.最初状态:A和B的TCP进程都处于CLOSED状态 2.B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程处于LISTEN状态,等待客户的连接请求 3.A的TCP客户进程创建传输控制模块TCB,然后向B发出连接请求报文段,首部的同部位SYN=1,同时选择一个初始序号seq=x 这时,TCP客户进程进入SYN-SENT(同步已发送)状态 4.B收到连接请求后,如果同意建立连接,则向A发送确认。确认报文中SYN=1,ACK=1,确认号ack=x+1 同时选择一个自己的初始序号seq=y,服务器进程进入SYN-RCVD(同步收到)状态。 5.TCP客户端收到B的确认后,还要向B发送确认,确认报文ACK=1,确认号ack=y+1,自己的序号seq=x+1。这时,TCP连接建立,A进入ESTABLISHED状态 6.B收到A的确认后,也进入ESTABLISHED状态
四次挥手
具体流程:
1.初始状态:A和B都处于ESTABLISHED状态 2.A先向TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接。报文段中FIN=1,序号seq=u(已传送过的数据的最后一个字节的序号加1),这时A进入FIN-WAIT-1(终止等待1)状态,等待B确认。 3.B收到释放报文后即发出确认,确认号ack=u+1,字节序号是v(B前面已传送数据最后一个字节序号+1),B进入CLOSE-WAIT(关闭等待)状态。 这时的TCP处于半关闭状态。即:从B到A的方向的连接并未关闭。 4.A收到确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段 5.若B没有需要发送的数据,就通知TCP释放连接,FIN=1,选择序号w,ack=u+1,此时B进入LAST-ACK(最后确认)状态 6.A收到B的连接释放报文段后,必须对此发出确认,ACK=1,ack=w+1,seq=u+1,A进入TIME-WAIT(时间等待)状态 7.经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A进入CLOSED状态
- TIME-WAIT状态为什么必须等待2MSL时间?
- 为了保证A发送的最后一个ACK报文段能够到达B。(B收不到A发送的ACK时会重传关闭的报文,因此A需要等待其发送的ACK是否成功)
- 防止已失效的连接请求报文段出现在本连接中。
TCP流量控制
- 定义:让发送方的发送速率不要太快,要让接收方来得及接收。
- 滑动窗口实现流量控制 发送方的发送窗口不能超过接收方给出的接收窗口的数值。(TCP的窗口单位是字节,不是报文段)
- 解决死锁:TCP为每一个连接设一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节数据),对方就在确认这个探测报文段时给出现在的窗口值。
TCP拥塞控制
- 定义:计算机网络中的带宽、交换节点的缓存和处理机等都是网络资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况叫拥塞。
- 简单的通过增加一些资源,比如把结点缓存的存储空间扩大,或把链路更换为更高速率的链路,或把结点处理机的运算速度提供,并不能解决网络拥塞问题。 因为问题的实质是整个系统的各个部分不匹配,只有所有部分都平衡了,问题才能解决。
- 拥塞控制的四种算法:满开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)
为什么要三次握手?
为了防止已失效的连接请求报文突然又传送到了服务端,因为产生错误。 具体解释: “已失效的连接请求报文段”产生情况: client 发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞留,因此导致延误到连接释放以后的某个时间才到达 service。如果没有三次握手,那么此时server收到此失效的连接请求报文段,就误认为是 client再次发出的一个新的连接请求,于是向 client 发出确认报文段,同意建立连接,而此时 client 并没有发出建立连接的情况,因此并不会理会服务端的响应,而service将会一直等待client发送数据,因此就会导致这条连接线路白白浪费。 如果此时变成两次挥手行不行? 这个时候需要明白全双工与半双工,再进行回答。比如:
第一次握手: A给B打电话说,你可以听到我说话吗? 第二次握手: B收到了A的信息,然后对A说: 我可以听得到你说话啊,你能听得到我说话吗? 第三次握手: A收到了B的信息,然后说可以的,我要给你发信息啦! 在三次握手之后,A和B都能确定这么一件事: 我说的话,你能听到; 你说的话,我也能听到。 这样,就可以开始正常通信了,如果是两次,那将无法确定。
为什么要四次挥手?
TCP 协议是一种面向连接,可靠,基于字节流的传输层通信协议。TCP 是全双工模式(同一时刻可以同时发送和接收),这就意味着,当主机1发出 FIN 报文段时,只是表示主机1已结没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回 ACK报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会中断这次TCP连接。
TCP的三次握手与四次挥手
具体过程如下:
第一次握手:建立连接。客户端发送连接请求报文段,并将syn(标记位)设置为1,Squence Number(数据包序号)(seq)为x,接下来等待服务端确认,客户端进入SYN_SENT状态(请求连接);
第二次握手:服务端收到客户端的 SYN 报文段,对 SYN 报文段进行确认,设置 ack(确认号)为 x+1(即seq+1 ; 同时自己还要发送 SYN 请求信息,将 SYN 设置为1, seq为 y。服务端将上述所有信息放到 SYN+ACK 报文段中,一并发送给客户端,此时服务器进入 SYN_RECV状态。
SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。
第三次握手:客户端收到服务端的 SYN+ACK(确认符) 报文段;然后将 ACK 设置为 y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(连接成功)状态,完成TCP 的三次握手。
上面的解释可能有点不好理解,用《图解HTTP》中的一副插图 帮助大家。
最后再看一下完整的过程:
如果有大量的连接,每次在连接,关闭都要经历三次握手,四次挥手,这显然会造成性能低下。因此。Http 有一种叫做 长连接(keepalive connections) 的机制。它可以在传输数据后仍保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无需再次握手。