首先,TCP/IP是一个协议族,是IP、TCP、HTTP等协议的集合。
一、OSI七层模型每层的作用
假设A给B发送一封电子邮件,为“早上好”
- 在A输入完发送的内容点击发送的时候,进入了应用层协议的处理,该协议会在所要传送数据的前端附加一个首部标签。该首部标明了邮件内容和收件人。B收到A的数据,会分析首部与数据正文,并进行处理。应用层是为应用程序提供服务并规定应用程序中相关的细节
- 我们并不能保证A和B使用的邮件软件完全相同,于是将数据转化为特定的字符编码,如UTF-8,表示层与表示层之间为了识别编码格式也会附加首部信息。表示层主要是将固有的数据格式转化为网络标准的传输格式
- 假设A给B发送5封邮件,那么发送的顺序有很多种,可以每发一次建立一次连接,可以建立一次连接就发5次,也可以建立5个连接同时发送。决定采取何种发送方式是会话层的主要责任,会话层也会添加首部。会话层负责建立和断开连接,以及数据的分割等数据传输相关的管理
- 传输层在俩个主机之间创建逻辑上的通信连接,为了保证所传输的数据到达,会在通信俩端的计算机上进行确认,如果数据没有到达,他会负责重新发送。传输层起可靠传输的作用
- 在网络与网络相互连接的环境中,网络层负责将数据从发送端主机发送到接收端主机。网络层负责寻址和路由选择
- 链路层负责物理层面上互连节点的通信传输
- 物理层负责传输比特流
- 主机B收到后,从物理层开始逐层向上处理数据,最终读取早上好。
二、TCP/IP模型
- 应用层向用户提供一组常用的应用程序,比如电子邮件等;
- 传输层提供应用程序间的通信,其功能包括:格式化信息流、提供可靠传输;
- 网络层负责俩台主机之间的通信;
- 网络接口层负责接收网络层的IP数据报并发出去,或者从网络上接收物理帧,抽出IP数据报交给网络层
TCP建立连接的三次握手:
- 客户端将标志位SYN置为1,将该数据包发送给服务器端,等待服务器确认;
- 服务端收到该数据包后需要确认客户端的SYN,然后向客户端发送一个SYN+ACK包;
- 客户端收到服务器的SYN+ACK包,向服务器发送一个ACK包,此包发送完毕后,完成三次握手;
【问题】为什么是三次握手?俩次会怎么样? ?为了防止已经失效的报文段发送到服务器引起错误。在俩次握手的条件下,加入客户端发送的第一个连接请求的报文段在网络中滞留了一段时间,以致延误到释放连接后才到达服务端,服务端在接收到连接请求后就建立了连接,也就是说,俩次握手的条件下,只要服务端确认了客户端的连接请求,就会建立连接。三次握手就不会出现上述问题。
TCP释放连接的四次挥手
- 客户端发送一个FIN,用来关闭客户端到服务端的数据传输;
- 服务端收到FIN后,向客户端发送一个ACK;
- 服务端数据发送完成后,向客户端发送一个FIN;
- 客户端收到FIN后,向服务端发送一个ACK,进入TIME_WAIT状态。服务端收到后关闭连接,客户端等待2MSL还没有收到回复的话,证明服务器已经关闭连接,客户端也关闭连接,四次挥手结束;
【问题】为什么要有TIME_WAIT状态? ?因为在第三次握手阶段客户端发送的ACK报文可能会丢失,假如这个报文丢失了,服务端没有收到的情况下还会向客户端发送FIN,重新进行第四次挥手。如果没有这个的话,客户端发送了ACK就立即关闭连接,ACK报文丢失的情况下,服务端重新发送FIN客户端是收不到的,这样服务端就无法正常关闭。
三、TCP保证可靠的数据传输
TCP保证可靠的数据传输主要靠以下方式:校验和、序列号、超时重传、流量控制、拥塞控制
序列号:
?TCP传输的时候将每个字节的数据都进行了编号,这就是序列号,在传输的过程中,每次接收方收到数据后都会对传输放进行应答,告诉发送方发送了哪些信息,下次发送从哪里开始。
超时重传:
?由于序列号机制,在发送方发送数据后,会收到接收方的确认报文,并进行解析确认。如果发送方发送完数据后,没有收到接收方的确认,那么就有以下俩种可能:
- 发送方发送的消息丢失了,接收方没收到,无法返回确认信息;
- 接收方返回的ACK确认丢失了,发送发没收到;
TCP为了解决这个问题引入了超时重传机制,就是发送方在发送完毕后等待一段时间,假如没有收到接收方的确认,就重新发送。 3. 第一个原因:接收方接收到二次发送的数据,进行ACK应答; 4. 第二个原因:接收方发现接收的数据一样,(通过序列号认证),那么就直接丢弃该信息,并且进行ACK应答;
流量控制:
?接收端在接收到数据以后,会对其进行处理,如果发送端的发送速度过快,接收端的缓冲区很快会被塞满,此时发送端发送的数据都会丢包,进而引起超时重传等一系列反应。而TCP会根据接收端对数据的处理能力来决定发送端发送数据的速率,这个机制就是流量控制,TCP利用滑动窗口机制实现流量控制。
?滑动窗口就是在第三次握手的时候,双方把自己的数据接收缓冲池的大小告诉对方,在传输数据过程中,当缓冲池大小发生改变的时候,也要及时给对方发送更窗口的通知。
拥塞控制:
?如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,加剧了网络的拥塞程度。因此出现网络拥塞的时候,应该控制发送方的速率。
慢开始和拥塞避免 ?发送方会维持一个叫拥塞窗口的状态变量,该变量大小与网络的拥塞程度有关,并且在动态变化。发送方让自己的发送窗口等于或者小于拥塞窗口。
?慢开始的思路是不要一开始就发送大量的数据,先探测以下网络的拥塞程度,由小到大增加拥塞窗口的大小。 每经过一轮传输,cwnd大小就会加倍,为了防止cwnd过大引起网络阻塞,还需要一个慢开始门限ssthresh变量,当cwnd > ssthresh的时候,采用拥塞避免算法。
拥塞避免算法让cwnd缓慢增长,一轮传输后cwnd加1,而不是加倍。
?无论是在慢开始阶段还是在拥塞避免阶段,只要发送方没有接收到返回的ACK确认段,就认为是网络出现了拥塞,会把慢开始门限设置为出现拥塞的时候发送窗口大小的一半,然后把拥塞窗口设置为1,执行慢开始算法。
快重传和快恢复: ?快重传要求接收方在收到一个失序的报文段后就立即发出重复确认,目的是为了让发送端及早知道有报文段没有发送给对方。快重传算法规定,只要发送方一连收到3个重复确认就要立即重传对方没有收到的报文段,而不是要等待到重传倒计时结束后再发送。 当发送发收到3个重复确认的时候,执行乘法减小算法,将ssthresh门限减半,但是并不执行慢开始算法,而是将ewnd设置为ssthresh,执行拥塞避免算法。
因为网络出现拥塞不会收到好几个重复的确认,所以不执行慢开始。
四、TCP和UDP
区别:
- TCP面向连接,UDP无连接
- TCP可靠,UDP不可靠
- TCP传送少量数据,UDP传送大量数据
- TCP传输慢,UDP传输快
【问题】:说一说你对面向连接的理解? ?面向连接就好比人们打电话,只有在拨出电话号码并且对方拿起话筒接听后,双方才能进行通信,通信接收后将电话机扣上就相当于结束通信。因此,面向连接的传输需要建立通信和释放通信。这样可以避免发送无用的数据。
?面向无连接不需要建立和断开连接,就像是寄快递一样,处理邮递业务的营业员不需要确认接收的详细地址是否存在,也不需要确认接收者时候收到了包裹,只需要发出这个邮递就可以。因此,在面向无连接的通信中,不需要确认对端是否存在,即时接收端不存在或者无法接收数据,也能将数据发送出去。
|