计算机网络之TCP

1、基本概念:TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
● 面向连接:一定是「一对一」才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
● 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
● 字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃
2、⼀旦主机 A 和主机 B 建⽴了连接,那么进⾏通信的应⽤程序只使⽤这个虚拟的通信线路发送和接收数据就可以保证数据的传输,TCP 协议负责控制连接的建⽴、断开、保持等⼯作。
3、TCP 连接是 全双⼯服务(full-duplex service) 的,全双⼯是什么意思?全双⼯指的是主机 A 与另外⼀个主机
B 存在⼀条 TCP 连接,那么应⽤程数据就可以从主机 B 流向主机 A 的同时,也从主机 A 流向主机 B。
TCP 会将数据临时存储到连接的发送缓存(send buffer) 中,这个 send buffer 是三次握⼿之间设置的缓存之⼀,然后 TCP 在合适的时间将发送缓存中的数据发送到⽬标主机的接收缓存中,实际上,每⼀端都会有发送缓存和接收缓存,如下所示
在这里插入图片描述
每⼀个报⽂段可以传输的⻓度是有限的,不能超过 最⼤数据⻓度(Maximum Segment Size) ,俗称 MSS 。在报⽂段向下传输的过程中,会经过链路层,链路层有⼀个 Maximum Transmission Unit ,最⼤传输单元 MTU, 即数据链路层上所能通过最⼤数据包的⼤⼩,最⼤传输单元通常与通信接⼝有关。
流量控制:
发送方不能无脑的发数据给接收方,要考虑接收方处理能力。
如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。
为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。
TCP 通过使⽤⼀个接收窗⼝(receive window) 的变量来提供流量控制。接收窗⼝会给发送⽅⼀个指示到底还有多少可⽤的缓存空间。发送端会根据接收端的实际接受能⼒来控制发送的数据量。
接收端主机向发送端主机通知⾃⼰可以接收数据的⼤⼩,发送端会发送不超过这个限度的数据,这个⼤⼩限度就是窗⼝⼤⼩,还记得 TCP 的⾸部么,有⼀个接收窗⼝,我们上⾯聊的时候说这个字段⽤于流量控制。它⽤于指示接收⽅能够/愿意接收的字节数量。
发送端主机会定期发送⼀个 窗⼝探测包 ,这个包⽤于探测接收端主机是否还能够接受数据,当接收端的缓冲区⼀旦⾯临数据溢出的⻛险时,窗⼝⼤⼩的值也随之被设置为⼀个更⼩的值通知发送端,从⽽控制数据发送量。
在这里插入图片描述
发送端主机根据接收端主机的窗⼝⼤⼩进⾏流量控制。由此也可以防⽌发送端主机⼀次发送过⼤数据导致接收端主机⽆法处理。
如上图所示,当主机 B 收到报⽂段 2000 - 2999 之后缓冲区已满,不得不暂时停⽌接收数据。然后主机 A 发送窗⼝探测包,窗⼝探测包⾮常⼩仅仅⼀个字节。然后主机 B 更新缓冲区接收窗⼝⼤⼩并发送窗⼝更新通知给主机A,然后主机 A 再继续发送报⽂段。
在上⾯的发送过程中,窗⼝更新通知可能会丢失,⼀旦丢失发送端就不会发送数据,所以窗⼝探测包会随机发送,以避免这种情况发⽣。
拥塞控制
前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。
一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大….
所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。
于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。
为了在「发送方」调节所要发送数据的量,定义了一个叫做「拥塞窗口」的概念。
什么是拥塞窗口?和发送窗口有什么关系呢?
拥塞窗口 cwnd是发送方维护的一个 的状态变量,它会根据网络的拥塞程度动态变化的。
我们在前面提到过发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么由于入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。
拥塞窗口 cwnd 变化的规则:
● 只要网络中没有出现拥塞,cwnd 就会增大;
● 但网络中出现了拥塞,cwnd 就减少;
那么怎么知道当前网络是否出现了拥塞呢?
其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞。
TCP 三次握手和四次挥手
Tcp三次握手:
客户端与服务端通信前会建立连接,客户端首先会在本地创建一个数据结构,包含源端口、目的端口、序列号、应答号、缓冲区等等,然后向服务端发送一个syn同步信号并将序列号一并发送给服务端,服务端接收到同步请求,也会在本地创建一个数据结构包含源端口、目的端口、序列号、应答号、缓冲区,然后服务端会对客户端进行回应,发送一个ack(ack为客户端的序列号加一),并将服务端的序列号一并发送给客户端,客户端收到服务端的回应后,会进行回应ack(ack为服务端的序列号加一)服务端,服务端接收到后,连接就建立完毕,就可以进行通信了
为什么是三次握手?
TCP是面向连接、可靠的传输层协议,为了保证可靠性,双方需要保存一个序列号,因为网络传输中有可能发生数据丢失的问题,因此根据序列号进行重传
在这里插入图片描述
Tcp四次挥手
客户端发起关闭连接的请求给到服务端,此时客户端处于等待状态,表示客户端不再发送数据给服务端,但还能接收数据,服务端接收到关闭连接的请求后,立即进行回应(避免客户端重新发送请求),客户端接收到回应,继续等待,因为服务端可能还有数据处理,等到处理完毕后,服务端会发起关闭连接的报文给到客户端表示服务端不再发送数据给客户端,客户端接收到报文后,立即ack回应服务端,服务端接收到报文后会立即关闭连接释放资源,但是客户端不是立即关闭连接,需要等待发送一个报文来回的时间,才能关闭连接
为什么是四次挥手?
因为TCP是全双工,双方可以互相通信,关闭连接需要双方都要关闭连接
客户端为什么不是立即关闭连接?
(1)、如果客户端发送的ack回应报文丢失了,就会导致服务端不会关闭连接以及释放资源,服务端会一直发送关闭连接的报文给客户端
(2)、客户端立即关闭连接释放资源,对应的端口就会被其他客户端使用,同时服务端还会一直向该端口发送关闭连接的报文,这样会导致其他客户端的连接混乱
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值