1.OSI七层模型,各层协议,TCP/IP四层模型
从下到上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
四层:网络接口层、网络层、传输层、应用层。
数据链路层:PPP点对点传输协议,交换机。
网络层:IP、ICMP(ping)、路由器。
传输层:UDP、TCP。
应用层:UDP 对应 DNS域名解析、TFTP简单文件传输协议
TCP 对应 HTTP、Telnet远程登录、SMTP 简单邮件传输协议、
2.TCP 三次握手与四次挥手
因为 TCP 是双向的,所以建立连接时:首先 客户端向服务器 发送 SYN=1 的报文,SYN 表示请求连接进行同步,Seq序列号为 x,客户端处于 SYN Send 同步已发送状态。
服务器需要确认收到报文,ACK置1,ack 表示希望收到的下一个报文的序号,=x+1,而服务器也需要与客户端建立连接并同步序列化,所以 SYN=1,假设序列号 Seq 是 y,报文的每个字节都会有编号, Seq 是第一个字节的编号。 发送报文后服务器处于 SYN Rcvd 状态。
客户端收到响应报文后会处于 established 连接已建立,它也需要确认服务器的连接,ACK置1,ack=y+1,序列号 Seq=x+1。服务器收到这个报文后也处于 established 连接已建立状态。
挥手:客户端先与服务器断开连接,发送 FIN 报文,处于 FIN WAIT1 状态,假设这个报文序列号是 a;
服务器需要确认收到,响应报文的 ACK 置1,ack=a+1,假设序列号是 b,之后服务器处于 wait-closed 等待关闭状态。 客户端收到响应后会处于 FIN WAIT2 状态。
接下来服务器需要与客户端断开连接,发送 FIN 报文,这个报文的序列号 是 c,之后服务器处于 last-ack 最后确认状态。
客户端收到响应后需要确认 发送报文 ACK置1,序列号 Seq=a+1,ack=c+1,处于 time-closed 状态,经过 2 MSL 后变为 closed 连接关闭状态。
服务器收到报文就会处于 closed 关闭状态。
为什么是 2MSL[max segement livetime] 呢?
(1)因为如果服务器发来 FIN 后,客户端发送的确认报文 ACK 出现了丢包情况,那服务器没有被确认,就会不断地发送 FIN 报文,所以客户端不能立即关闭,需要等待一段时间。
(2)经过 MSL 后这次报文都会消失,下一次就是新的报文了。
为什么是三次握手,挥手却是四次呢?
因为握手 SYN 与 ACK 可以在一次报文中同时发送,而 挥手 FIN 与 ACK 不能同时发送。
其实,通过WireShark 抓包可以看到 FIN 与 ACK 在一次报文中发送的情景,但是这是作为客户端,关闭浏览器进行抓包的,并不清楚服务器那边发送报文的情况。
3.TCP 与 UDP 的区别
TCP 是面向连接的,会按序重组,是可靠的传输,UDP 不面向连接,尽最大可能交付,不保证可靠。
TCP 面向字节流,有滑动窗口机制实现流量控制。
TCP 是点对点的,而 UDP 可以是一对一、一对多、多对多的。
4.TCP 滑动窗口机制
TCP 传输数据是一批一批的,就像窗口一样,随着数据被确认,窗口大小会变化,所以说是 滑动窗口。
TCP 发送端的数据分为 已发送已确认、已发送未收到对方确认、未发送已确认 和 未发送未确认,已发送未确认 和 未发送已确认的数据组成了 发送窗口。发送窗口的大小受硬件、应用的限制(比如 发送速率不能快于 应用处理数据的速率)、对方接受窗口的大小。
TCP 接收端的数据分为 已接受已确认、未接受已确认、未接受未确认的,未接受已确认的数据组成了 接受窗口。
在 TCP 协议报文中,有个字段“窗口”,规定了窗口的大小,它是 2 字节的,也就是 16 位,所以滑动窗口的最大容量就是 2 的 16 -1 = 65535 个字节。 还有个字段“选项”,有规定滑动窗口扩大因子。
5.TCP 窗口的大小为0 意味着什么
接收方不会再等待,而是启动计时器,定时发送一个试探报文给对方,试探报文是没有数据的,如果发送方窗口大小不为0 就会进行传输;否则就重启计时器,这个计时器叫持续计时器。
6.TCP 网络拥塞控制
网络拥塞的实质是 对网络资源的请求大于可提供的资源。解决的方法无非是:减少请求(比如 限制请求) 和 提供更多资源,比如 增加链路。
出现 分组丢失 是拥塞的一个征兆,而不是本质原因。
TCP 实现网络拥塞控制的方法:慢启动、拥塞避免、快重传、快恢复。
慢启动:TCP 建立连接后不是立即发送最大数据段 MSS max segement size的数据,比如说,它第一次传输时是 100 个字节,收到 ACK 确认后,第二次是 200 个字节,依次类推。慢启动中维护了一个 拥塞窗口,实际传输数据的大小是 阻塞窗口 和 发送窗口中的最小值,初始 阻塞窗口的大小 ,是 1MSS,当 计时器没有超时,且 收到确认之后,阻塞窗口就会成 2 倍增长,以此类推,直到出现分组丢失的情况,这个节点叫 慢启动阈值,这时会将 拥塞窗口恢复至初始值,阈值变为原来的 1/2,再次进行慢启动,直到第二次达到阈值,就会触发 拥塞避免机制。
拥塞避免:拥塞窗口扩容不是以 2 倍,指数形式的,而是以线性扩容。
快重传:当接收方收到 3 次相同的 ACK,就会认为出现了丢包的情况,这时即使没有到计时器的时间,也会清零计时器 ,进行重传。这样相比 计时器超时后才重传快。
快恢复:快重传发送丢失的数据后,拥塞窗口的大小会变为阈值的一半,然后执行拥塞避免算法,使拥塞窗口慢慢加大。