走进网络编程与Netty

网络编程与Netty(一) 计算机网络基础部分-下

TCP概述

​ TCP是面向连接的通信协议,通过三次握手建立连接才能开始数据的读写,通讯完成时要断开连接,由于TCP是面向连接的,所以只能用于端对端的通讯。

​ TCP提供的是一种可靠的数据流服务,数据有可能被拆分后发送,那么采用超时重传机制和应答确认机制是组成TCP可靠传输的关键设计。

​ 在超时重传机制里面有个很重要的指标—重传超时的时间限定。网络环境并不是人为可以控制的,有时网络十分顺畅,有时有十分的卡顿,那么这个时间限定如果设置为一个固定值,是不科学不合理的,这样就需要根据网络环境等因素动态的调整这个值,那么就需要采样统计一个数据包从客服端到服务端往返一次的时长,这个时长就是RTT(round-trip time),然后根据这个时长通过各种算法和公式计算,最后确定重传超时值。

​ 数据在网络中进行传输时,是不能确保所有的数据都在同一条线路中传输的,每个数据都有可能走得不同的线路到达目的地,由此可知,IP层进行数据传输时,是不能保证数据包按照发送的顺序达到目的机器。当IP层把它们向上传给TCP层后,TCP将包排序病进行错误检查。TCP数据包中包含序号和确认,所以未按照顺序接收到的包可以被排序,而损坏的包可以被重传。

​ TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。同时,TCP是全双工的,也就是连接的双方可以同时点对点的发送信息。

TCP三次握手(面试常客)

走进网络编程与Netty_第1张图片

为什么需要三次握手?(面试常客)

​ TCP 是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小次数。为什么?RFC793,也就是 TCP 的协议 RFC 中就谈到了原因,这是因为:

​ 为了实现可靠数据传输, TCP 协议的通信双方,都必须维护一个序列号, 以标识发送出去的数据包中,哪些是已经被对方收到的。

​ 举例说明:发送方在发送数据包时, 同时送上一个序号( 假设 为 100),那么接收方收到这个数据包以后, 就可以回复一个确认号(110 = 100 + 10) 告诉发送方 “我已经收到了你的数据包, 你可以发送下一个数据包, 序号从 111 开始” 。

​ 三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。

​ 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

​ 至于为什么不是四次,很明显,三次握手后,通信的双方都已经知道了对方序列号起始值,也确认了对方知道自己序列号起始值,第四次握手已经毫无必要了。

TCP四次挥手(面试常客)

走进网络编程与Netty_第2张图片

为什么需要四次挥手(面试常客)

​ TCP 是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。

​ 如果一方已经准备关闭写,但是它还可以读另一方发送的数据。A方发送 FIN 结束报文给B方,B方收到后,回复 ACK 报文。当B方也已经写完了准备关闭,发送 FIN 报文,A方回 复 ACK。两端都关闭,TCP 连接正常关闭。

TCP和UDP(面试常客)

​ TCP 和 UDP 都是传输层的协议,传输层主要为两台主机上的应用程序提供端到端的通信。

​ TCP 和 UDP 最不同的地方是,TCP 提供了一种可靠的数据传输服务,TCP 是面向连接的,也就是说,利用 TCP 通信的两台主机首先要经历一个建立连接的过程,等到连接建立后才开始传输数据,而且传输过程中采用“带重传的确认”技术来实现传输的可靠性。TCP 还采用一种称为“滑动窗口”的方式进行流量控制,发送完成后还会关闭连接。所以 TCP 要比UDP 可靠的多。

​ UDP(User Datagram Protocol 的简称, 中文名是用户数据报协议)是把数据直接发出去,而不管对方是不是在接收,也不管对方是否能接收的了,也不需要接收方确认,属于不可靠的传输,可能会出现丢包现象。

你可能感兴趣的