TCP/IP的学习总结

752 阅读12分钟

这篇文章是自己所学的《计算机网络》这门课程的总结,如果有任何错误欢迎指正。

TCP/IP模型

应用层:具体应用程序实现层
运输层:让应用程序之间实现通信
网络层(或网际层):主要利用IP协议转发分包数据
网络接口层:TCP/IP对网络接口层未作定义

网络层和运输层的功能通常由操作系统提供,一般通过操作系统的Socket接口

网络层

网络层中最重要的就是IP协议。如下图,通过IP协议可以实现在不同的网络中进行通信,而不用关系下层的网络接口层中所使用的协议。

IP协议是无连接的、尽最大努力交付的不可靠协议

IP地址

IP地址是IP协议用来识别不同主机的地址,类似于MAC地址。

两级IP 地址

net-id代表网络号,host-id代表主机号

三级IP 地址

以A类地址为例,一个A类地址可以连2^24个主机,但是我只需要连接2^20个主机,而使用B类地址又不足,这种情况就造成了浪费;再加上IP地址快耗尽的问题,就出现了三级IP 地址。

如下图,通过从主机号借用若干个位作为子网号subnet-id,而主机号 host-id也就相应减少了若干个位。通过这种方式就可以对IP地址进行更精细地划分,从而减少IP地址地浪费。而且划分子网纯属一个单位内部的事情单位对外仍然表现为没有划分子网的网络,从而兼容以前的两级IP 地址。

子网掩码

通过子网掩码来获取IP地址中的子网部分,如图IP地址与子网掩码进行与运算得到子网的网络地址:

无分类编址(CIDR)

由于IPv4的地址即将耗尽,就采用无分类编址(CIDR)消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,从而使用各种长度的“网络前缀”来代替分类地址中的网络号和子网号。

网络层的其他协议

ICMP协议

IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。ICMP不是高层协议,而是IP层的协议。
当传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。

RAP协议

RAP协议是通过目的IP地址来获取目的MAC地址的协议。

IP协议数据报格式

版本:IP协议的版本,占4位
生存时间(TTL):数据报在网络中可通过的路由器数,IP数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。
协议:0x11代表UDP,0x06代表TCP

运输层

TCP与UDP的区别

TCP UDP
可靠性 可靠 不可靠
连接性 面向连接 无连接
报文 面向字节流 面向报文
流量控制
堵塞控制
传播速度
应用场景 对数据准确性要求高的场景 对数据效率要求高的,比如视频通话等。

面向报文和面向字节流的区别:

如图,面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率;若太短,会使IP数据报太小。
如图,面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。

TCP

三次握手和四次挥手

TCP是面向连接的运输层协议,因此需要先建立连接,在进行数据传输。TCP建立连接的方式是三次握手,而切断连接是通过四次挥手。

三次握手和四次挥手

为什么要三次握手?

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
具体例子——“已失效的连接请求报文段”的产生在这样一种情况下:

客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器。

本来这是一个早已失效的报文段。但服务器收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。

假设不采用“三次握手”,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送数据。但服务器却以为新的运输连接已经建立,并一直等待客户端发来数据。这样,服务器的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。
例如刚才那种情况,客户端不会向服务器的确认发出确认。服务器由于收不到确认,就知道客户端并没有要求建立连接。”

为什么要四次分手?

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;

但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

为什么要等待2MSL?

  • 保证TCP协议的全双工连接能够可靠关闭
  • 保证这次连接的重复数据段从网络中消失

MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。

转载TCP/IP · Android校招面试指南

流量控制

流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。 利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

滑动窗口机制:滑动窗口机制就是发送方和接收方各自维护一个发送窗口和接受窗口。当网络堵塞时,接收方可以减小接受窗口的大小,同时在确定报文中设置发送窗口的大小,当发送方接受到确定报文时,可以减小发送窗口的大小,从而减少发送速率。同理,当网络通畅时,可以提高发送速率。

TCP为每一个连接设有一个持续计时器(persistence timer)。当TCP连接中的发送方收到接收方的零窗口通知时(即rwnd=0时),发送方就启动持续计时器。若持续计时器设置的时间到期,发送方就发送一个零窗口控测报文段(携1字节的数据)给接收方。如果接收方可以接收数据,就重新开始发送数据;如果接收方不能接收数据,就重新设置持续计时器。

堵塞控制

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,就产生拥塞

堵塞控制和流量控制的区别?

  • 拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
  • 流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

堵塞控制的方法:

  1. 慢开始和拥塞避免
  2. 快重传和快恢复
慢开始和拥塞避免

发送方维护一个叫做拥塞窗口的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。 发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少到网络中的分组数。

如上图,慢开始算法:

使用慢开始算法后,每经过一个传输轮次,拥塞窗口 cwnd 就加倍。 一个传输轮次所经历的时间其实就是往返时间 RTT。传输轮次更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。

拥塞避免算法

拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。

由于指数爆炸的性质,就必须设置慢开始的门限 ssthresh ,其用法如下:

  1. cwnd < ssthresh 时,使用慢开始算法。
  2. cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
  3. cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。 然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。 这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。如下图:

快重传和快恢复

快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。 不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。如下图:

快恢复

  1. 当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。
  2. 由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

注意发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个
rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值。
cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值。

应用层

DNS

DNS 是一个 域名 和 IP 相互映射的分布式数据库,通过DNS我们就可以通过域名更方便的访问互联网 详细的见DNS基础知识

HTTP

HTTP是超文本传输协议,用于客户端和服务器端之间的通信,属于TCP/IP中的应用层。 详细的见见《图解HTTP》核心知识总结

参考资料: