TCP功能
flow-control意思是:B一直在对A说,你不要发的太快了,停一停,等一等你的接收方吧!咦,我还有空间,还可以再快点!
TCP头
为了确保数据可靠传输,TCP头要做的工作很多,因此组成部分也很多。我们只需知道每一部分所做的工作即可,无需记住每一部分的布局。
Destination port:【应传输字节给接收方的哪一个应用程序】
著名的端口号:
ssh服务器:22
web数据:80
smtp:23
其他端口号可以在IANA port number上查找
Source port:【传输字节来自于发送方的哪一个应用程序】
发送方如果是用户个人主机,那么source port不像destination port那么固定,而是通过一定的方法产生(参见下文的TCP连接部分),用来确保该TCP连接是唯一的。
Sequence:【当前数据包位于字节流中的位置】。如果当前序列号是1000,当前包的字节数目是500,那么下一个包的序列号是1500。
Acknowledgment Sequence:【下一个待发送的数据包位于字节流中的位置】。发送时会写上ack seq,通过ack seq=seq+发送的数据最后一个字节的seq+1表示数据的长度。这也表示我们已经成功接受了每个字节。例如:当前确认序列号是751,序列号是500,表示数据长度理应是250,序列号是500~750
原视频中,ack sequence的含义是:The acknowledgment sequence number in the segment from B back to A tells us which byte B is expecting next,offset by A’s initial sequence number
Checksum:【将数据的长度和TCP头的长度加起来,用于检验数据是否出错】。例如线路上的位错误或者是路由器的存储器错误
HLEN:【TCP头的长度】
flags:【信号信息】。
——ack确认对方发的syn信号有效,用于三次握手
——syn发送同步信号,表示该数据包【包含待发送的数据流的首字节】,用于三次握手
——fin指示连接的一个方向关闭,用于连接的结束
——psh告诉另一端的TCP层立即传送数据
——urg配合urgent pointer使用,告诉另一端这个紧急的数据包该走哪条快速通道urgent pointer
有人可能会问“为什么不试一下,每次发送的数据包都设置成是单独的数据流呢?或者说,将数据流拆分成小的数据流,甚至小到一个数据流只包含一个数据包?这样会引起安全的问题。首先是因为:这样别人就能猜到你的实际序列号,从而散步数据包。其次是:如果这样划分,那么你就会有很多生命周期很短的连接,不同的数据流会有大量相似序列号的数据包,它们会在网络中长期生存下来,需要你把他们过滤出来。”
window size:用于告诉接收方sliding window的尺寸N
TCP连接
要确保每个TCP连接都是唯一的,有以下几种方法:
1.确保连接的发起方A选择唯一的源端口号,不会意外选择与【已经在另一个连接使用的源端口号】相同的源端口号。也就是说,如果A发起多个连接(connection),连接到B,那么A与B之间任一连接之间使用的源端口号不能相同,同一时间一个源端口号只能有一个连接(connection)。
实现方法:每次新建连接就增加源端口号。由于源端口号是16位的,因此需要64k个新连接才会使得源端口号重复。
此处的增加,原文是increment,表示离散的增加而不是连续的增加
假如突然增加大量连接,又或者有一个TCP段在网络中存在了很久很久不走(卡在路由缓冲区或在临时循环中循环),使得源端口号重复了。为了减少这种可能性,TCP连接使用第二种方法:
2.TCP连接使用随机的初始值,也就是使用随机的初始序列号(Initial Sequence Number,ISN)进行初始化,来引用字节流中字节的序列号Sequence。这一点用于三次握手中:
TCP的三次握手(简要概述):
若A想向B发送数据,则
1.A启动与B的连接时,会发送一个syn+ISNA。
syn表示希望建立TCP链路。
ISNA用于A到B的字节流,表示要发送的字节是字节流中的第几个
2.B收到syn以后,回复A并启动连接时,回复给A一个syn+ack+ISNB。
ack表示B确认A的请求,同意建立A到B的通信。
回送syn表示TCP层想要与A的TCP层建立链路。
ISNB用于B到A的字节流,表示待接收的字节在字节流中的起始编号
3.A响应一个ack,表示它在反方向正在接受B到A的通信请求
现在两者可以准备开始相互发送数据了。
下面的情况可能需要A重新发送数据包:
1.原数据包被丢弃
2.A没有收到ack
数据发送完毕后,
1.A发送fin消息,表示A要结束对B的数据传输
2.B发送ack消息,确认A不再有要发送的数据,并停止从中寻找新的数据
但此时B仍能向A发送数据
3.B完成向A的数据传输后,发送fin
4.A发送ack消息
此时完全关闭连接,可以移除链路了。
总结:TCP提供了可靠的字节流传输
UDP
from:
【斯坦福大学】CS144 计算机网络介绍 I(1-93·中英字幕·机翻)