TCP/IP的学习总结

这篇文章是本身所学的《计算机网络》这门课程的总结,若是有任何错误欢迎指正。html

TCP/IP模型

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

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

网络层

网络层中最重要的就是IP协议。以下图,经过IP协议能够实如今不一样的网络中进行通讯,而不用关系下层的网络接口层中所使用的协议。 git

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层以上的协议是可能作到安全的缘由。tcp

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》核心知识总结

参考资料:

相关文章
相关标签/搜索