TCP概述RFCs:793,1122,1323,2018,2581
点对点:
一个发送方,一个接收方
可靠,按序的字节流:
无“报文边界”,无结构但有顺序
流水式控制:
TCP的拥塞和流量控制,设置窗口大小
发送&接收缓存
全双工数据传输:
在同一连接上双向传输
MSS:maximum segment size(最大段字节数-1500,536,512)
面向连接:
握手过程(交换控制信息)在交换数据前初始化收发双方的状态“三次握手”
流量控制:
发送方的发送速度不得超过接收方的处理速度
TCP段格式(p80)
TCPseq.#’s和ACKs
Seq.#’s:
该数据段第一个字节在(整个报文)字节流中“编号”
ACKs:
seq#为预期从对方发来的“下一个”字节的编号
积累的ACK
Q:接收方如何接受失序的数据段
A:TCP没有定义,-由程序设计者决定
TCP:可靠数据传输
简化的发送方,假设
单向数据传输
无流量,拥塞控制
TCP:可靠数据传输
简化的TCP发送方
00 sendbase=initial_sequence number
01 nextseqnum = initial_sequence number
02
03 loop (forever) {
04 switch(event)
05 event:data received from application above
06 create TCP segment with sequence number nextseqnum
07 start timer for segment nextseqnum
08 pass segment to IP
09 nextseqnum=nextseqnum + length(data)
10 event:timer timeout for segment with sequence number y
11 retransmit segment with sequence number y
12 compue new timeout interval for segment y
13 restart timer for sequence number y
14 event:ACK received, with ACK field value of y
15 if (y > sendbase) { /* cumulative ACK of all data up to y */
16 cancel all timers for segments with sequence numbers < y
17 sendbase = y
18 }
19 else { /* a duplicate ACK for already ACKed segment */
20 increment number of duplicate ACKs received for y
21 if (number of duplicate ACKS received for y == 3) {
22 /* TCP fast retransmit */
23 resend segment with sequence number y
24 restart timer for segment y
25 }
26 } /* end of loop forever */
TCP ACK规则
TCP:重传场景
TCP流量控制
流量控制
发送端不可发送的太多、太快以至于使得接收端的缓存溢出
RcvBuffer=接收端的 TCP 缓存大小
RcvWindow=缓存中空闲的部分
接收端:显式通知发送端(动态变化中的)自由缓存空间
RcvWindow TCP数据段的字段
发送端:需要保存已经发送,unACKed数据可少于最近收到的RcvWindow
TCP连接管理
TCP收发双方在数据交换开始之前需要建立连接
初始化TCP变量:
seq.#s
缓存,流量控制信息(e.g. RcvWindow)
客户端:连接的发起者
Socket clientSocket=new Socket("hostname","port number"); -JAVA
服务器:接受客户端的连接
Socket connectionSocket=welcomeSocket.accept();
(建立连接)三次握手:
Step1:客户端的end system向服务器发送TCP SYN控制数据段
定义并初始化seq#
Step 2:服务器的end system接收SYN,用SYNACK控制数据段回答
ACKs接收到的SYN
分配缓存
定义server-> receiver初始化seq.#
Step3:客户端的end system向服务器发送ACK
ACKs接收到的连接承诺
分配缓存
TCP连接管理(续)
关闭连接:
客户端关闭插口:clientSocket.close();
Step1:客户端发送 TCP FIN 控制段给服务器
Step2:服务器收到
FIN,用ACK应答.关闭连接,发送FIN.
TCP 连接管理(续)
Step3:客户端收到FIN,用ACK进行应答.
随着对接收到的FIN发送ACK-同时进入“timed wait(计时等待)”
Step4:服务器,接收ACK.连接关闭.
注意:稍加修改,即可管理同时发生的多个FINs.
TCP连接管理(续)