计算机网络(二)--TCP连接
一.三次握手
1.三次握手

客户端发送一个SYN给服务端,SYN是由一个算法计算出来的, 同时把 SYN 标志位置为 1 , 服务端接收之后 , 发送ACK,ACK为客户端发送的SYN+1,并且发送自己的SYN,并把 SYN 和 ACK 标志位置为1。

跟上面的一样,ACK也是用SYN+1表示
2.为什么是三次握手
这个要从初始化Socket和确定序列号和窗口大小
① 避免历史重复连接
当之前因为网络阻塞等原因而延迟到达的SYN,服务端回复ACK,但是客户端会根据自身的上下文判断这是一个历史连接,客户端就会发送一个RST给服务端,表示中止连接
② 同步双方初始化序列号
③ 避免资源浪费
如果只有两次握手,那么当网络阻塞的时候,客户端会发送很多个SYN,服务端每次接收到发送ACK就会立即建立连接,就会建立很多个连接。
3.为什么ip层会分片,而TCP还需要MSS?

因为如果出现丢包情况,ip层是没有重传机制的,会交给TCP进行重传,会重新传整个TCP报文,所以当TCP也有分片的时候,如果出现了丢包,那么tcp只会重传MSS单位的数据。
4.SYN攻击是什么
服务端的SYN队列被塞满,
应对方法:使用cookie
5.如果建立了连接,但是客户端故障了
TCP有一个“保活机制”,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到相应,则认为当前的TCP连接已死。
定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。
6.Linux系统中查看TCP状态
netstat -napt
二.四次挥手

1.FIN_WAIT
客户端发送了FIN之后,只是表示客户端不发送数据了而已,但是服务端可能还有代理处理和发送的数据,等到服务端不再发送数据的时候,才发送FIN给客户端
2.2MSL
报文最大生存时间
网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。
MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL 字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。
MSL 与 TTL 的区别:MSL 的单位是时间,而 TTL 是经过路由跳数。所以 MSL 应该要大于等于 TTL 消耗为 0 的时间,以确保报文已被自然消亡。
3.为什么需要TIME_WAIT
①防止旧连接的数据包
如果接收到FIN之后就立马断开的话,如果网络延迟,还有数据报文还没到达服务端,过了一会又发送到了,这样子就又得重新建立连接
②保证连接正确关闭
三.TCP和UDP的区别
1.UDP和TCP的对比
| TCP | UDP |
| 有连接 | 无连接 |
| 一对一 | 一对一,一对多,多对多,多对一 |
| 可靠传输 | 尽最大努力交付,不保证可靠交付数据 |
| 首部开销大 | |
| 有拥塞控制和流量控制 |
TCP经常用于 FTP/文件传输
UDP用于语音/视频等多媒体通信,广播通信
2.超时重传

RTT 就是数据从网络一端传送到另一端所需的时间,也就是包的往返时间。
超时重传时间是以 RTO 表示.
超时重传时间 RTO 的值应该略大于报文往返 RTT 的值。
3.快速重传
快速重传(Fast Retransmit)机制,它不以时间为驱动,而是以数据驱动重传。
快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。
(1)SACK
SACK( Selective Acknowledgment 选择性确认)。
这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。

(2)D-SACK
3.滑动窗口
窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。举个栗子,比如我一次性可以发送100条数据,不管服务端有没有收到,反正我这边就发出100个。
窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
4.流量控制
TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。
5.拥塞控制
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大….
拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。
- 慢启动
- 拥塞避免
- 拥塞发生
- 快速恢复
浙公网安备 33010602011771号