TCP/IP网络协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网际层协议。
是⼀一个协议家族, 以TCP、IP协议为核⼼心, 包含HTTP、SMTP、TELNET等各种协议。
OSI七层模型
OSI(开放系统互联(Open System Interconnection))一般指开放式系统互联
开放式系统互联是把网络通信的工作分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。
第七层: 应用层 为操作系统或者网络应用程序提供访问网络服务的接口。 (html)
第六层: 表示层 压缩,格式转换
第五层: 会话层 负责数据传输中维持网络设备之间的通信链接
第四层: 传输层 把传输表头加到数据上形成数据包,完成端到端的数据传输。协议:TCP UDP
第三层: 网络层 负责对子网间的数据包进行寻址和路由选择,可以实现拥塞控制、网际互联等功能。协议:IP; (路由器)
第二层: 数据链路层 物理地址寻址 (交换机/猫)
第一层: 物理层 在局域网上进行数据传输,负责电脑通信设备与网络媒体之间的互通 (网线网卡……)
数据包
数据包是⽹网络层及以上分层中包的单位
每个分层都会对发送的数据添加一个首部, 首部包含了该层协议相关的信息, 而真正要发送的内容称之为数据.
也就是说每一个数据包都由首部 + 数据组成.
而对于下层来说, 上层发送过来的全部内容, 都会当做本层的数据, 举个例子:
传输层 TCP包:TCP包首部 + 数据 网络层 IP包:IP包首部 + (TCP包首部 + 数据) 数据链路层 以太网包:以太网包首部 + (IP包首部 + (TCP包首部 + 数据))
每层在接收到数据后除了添加首部, 还要做什么呢?
用户1
- 传输层:TCP模块为保证数据的可靠传输, 需要添加TCP首部
- 网络层:IP包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
- 数据链路层:生成的以太网数据包将通过物理层传输给接收端
用户2
- 数据链路层:主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,比如IP.
- 网络层:从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,比如TCP
- 传输层:在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照顺序接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
总结一下几个地址:
- 数据链路层的是MAC地址, 用来识别同一链路中的不同计算机
- 网络层的是IP地址, 用来识别TCP/IP 网络中互连的主机和路由器
- 传输层的是端口号(程序地址), 用来识别同一台计算机中进行通信的不同应用程序
通过以下这几个数据综合来识别一次通信:
- IP首部:源IP地址
- IP首部:目标IP地址
- 协议号, TCP或者UDP
- TCP首部:源端口号
- TCP首部:目标端口号
TCP/UDP的区别
用户数据报协议(UDP,User Datagram Protocol)
- UDP是无连接的,TCP必须三次握手建立连接
- UDP是面向报文,没有拥塞控制,所以速度快,适合多媒体通信要求,比如及时聊天,支持一对一,一队多。多对一,多对多。
- TCP只能是一对一的可靠性传输
那么咱们的直播底层是什么协议呢?
其实现在常见的rtmp和hls直播, 都是基于TCP的, 希望能提供稳定的直播环境.
TCP通过什么方式提供可靠性?
- 超时重发,发出报文段要是没有收到及时的确认,会重发。
- 数据包的校验,也就是校验首部数据和。
- 对失序的数据重新排序
- 进行流量控制,防止缓冲区溢出
- 快重传和快恢复
- TCP会将数据截断为合理的长度
TCP如何控制拥塞?
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
1当cwnd<ssthresh时,使用慢开始算法。也就是乘法算法23当cwnd>ssthresh时,改用拥塞避免算法。也就是加法算法45当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
当出现拥塞的时候就把心的门限值设为此时窗口大小的一般,窗口大小设置为1,再重新执行上面的步骤。 当收到连续三个重传的时候这就需要快重传和快恢复了,当收到连续三个重传 这个时候发送方就要重传自己的信息,然后门限减半但是这个时候并不是网络阻塞,窗口只会减半执行拥塞避免算法。
TCP协议的一次数据传输, 从建立连接到断开连接都有哪些流程?
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认, 设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息, 将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中, 一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1, 向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态, 完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。通信结束客户端和服务端就断开连接,需要经过四次分手确认。
第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段; 此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1; 主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;
主机2收到主机1的ACK报文段以后,就关闭连接; 此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
IP地址
IP 地址(IPv4 地址)由32位正整数来表示,在计算机内部以二进制方式被处理。日常生活中,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数
IP地址包含网络标识和主机标识, 比如152.112.110.16
152.112.110就是网络标识, 同一网段内网络标识必须相同 16就是主机标识, 同一网段内主机标识不能重复
IPv6
IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。
DNS
我们平时访问一个网站, 一个应用程序, 并不是用ip来访问的, 而是用一个域名. 那么域名是怎么和ip地址建立联系的呢?
就是通过dns, Domain Name System. 比如wiki上的一个例子
以访问 zh.wikipedia.org 为例:
客户端发送查询报文”query zh.wikipedia.org”至DNS服务器,DNS服务器首先检查自身缓存,如果存在记录则直接返回结果。 如果记录老化或不存在,则: DNS服务器向根域名服务器发送查询报文”query zh.wikipedia.org”,根域名服务器返回顶级域 .org 的顶级域名服务器地址。 DNS服务器向 .org 域的顶级域名服务器发送查询报文”query zh.wikipedia.org”,得到二级域 .wikipedia.org 的权威域名服务器地址。 DNS服务器向 .wikipedia.org 域的权威域名服务器发送查询报文”query zh.wikipedia.org”,得到主机 zh 的A记录,存入自身缓存并返回给客户端。