CN-TCP-2

Molaters Lv5
[[计算机网络]]

TCP流量控制

接收方为TCP连接分配buffer

蓝色表示空出来的可以接受数据的

上层应用可能处理buffer中数据的速度较慢就会导致buffer溢出,淹没接收方。

所以这就是buffer control

所以怎么做流量控制?

Buffer中的可用空间(spare room)

= RcvWindow

= RcvBuffer - (LastByteRcvd - LastByteRead)

Reciever通过在Segment头部字段将RcvWindow告诉Sender

Sender限制自己已经发送的但是还没有收到ACK的数据不超过接收方的空闲RcvWindow尺寸

Receiver告知Sender RcvWindow = 0 , 会出现什么情况?

[!TIP]
会增加一个额外的处理,即使是Window = 0 ,仍然可以有很小一部分的数据可以进行传输

TCP的连接管理

面向连接的连接协议

TCP sender & reciever 会建立连接

初始化TCP变量

Seq #
Buffer 和流量控制信息

Client : 连接的发起者

创建一个套接字Socket,将Socket设置主机名和端口号

Server : 等待客户连接请求

接受客户机发起的请求并建立连接

三次握手机制

[!Step1]
Client host send TCP SYN (标志段) segment to server

  • specifies initial seq #(选择自己的序列号并告诉服务器)
  • no data (不携带任何数据)

[!Step2]
Server host recieves SYN , replies with SYN & ACK segment
服务器接收到服务器的标志段,用标志段确认段来作为回复

  • server allocates buffers (为连接建立缓存)
  • specifies server initial seq #(选择自己的初始的序列号并告知客户端)

[!Step3]
client receives SYNACK, replies with ACK segment, which may contain data.接收到标志段确认段,客户机发送ACK报文段同意连接

image.png

[!INFO]
如果在三次握手的第二步服务器分配资源,最后一次握手如果没有发过来,服务端会保留连接,一段时间没有收到ACK才会关闭连接

关闭连接

Closing a connection:

1
2
// client closes socket
clientSocket.close();

[!Step1]
client向server发送TCP发送TCP FIN控制segment

[!Step2]
server收到FIN,回复ACK,关闭连接,发送FIN

[!Step3]
client收到FIN,回复ACK。

  • 进入等待 —— 如果收到FIN,就会重新发送ACK

[!Step4]
server收到ACK,连接关闭

1
2
3
4
graph TB
A["Closed"]-->|client application initiates a TCP connection| B["SYN_SENT"]
B-->|recieve SYN & ACK send ACK| C["ESTABLISHED"]
C-->|client application initiates close connection \n Send FIN|D["FIN_WAIT_1"]-->|receive ACK send nothing|E["FIN_WAIT_2"]-->|recieve FIN send ACK| F["TIME_WAIT"]-->|30s|A

同理可以给出服务端的生命周期图

image.png
  • 标题: CN-TCP-2
  • 作者: Molaters
  • 创建于 : 2023-11-24 10:14:50
  • 更新于 : 2023-10-12 17:07:09
  • 链接: https://molaters.github.io/2023/11/24/计算机网络/CN-TCP-2/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论
此页目录
CN-TCP-2