基本模型
从application layer到link layer,每一层的data被encapsulated到下一层的segment中
在TCP的视角中 信息的传递时stream of bytes
Host A把这段byte stream放进TCP segment中 传送给B
B的transport layer再把这段信息提取出来 传递到B的application layer
实际上 这个TCP segment可能需要被传输多次 以防止丢失
由A到B的segment中的sequence number是从ISN到这个segment的offset
由B到A的segment中的Ack number指的是 which byte B is expecting next(在B的byte stream中)
TCP 3-way handshake
三次握手 传输/关闭 Connection setup/ Connection teardown
关于 connection teardown
A发送 Fin message 到B - 关闭A到B的单向connection
B发送 (Data +)Ack 到A - B仍有剩余数据需要传送到A (如果需要的话)
B发送 Fin message 到A - 关闭B到A的单向connection(如果不再需要传输数据)
A发送 Syn message 到B - 确认connection is fully closed
TCP的特性&如何实现
Stream of Bytes / Reliable Delivery / In-sequence / Congestion Control
如何实现 Reliable Delivery 传输的可靠性:
1. Acknowledgment indicates correct delivery:当一个TCP layer收到了data,会发送Acknowledgment给这个data的发送者用来告知数据是否被正确无误地送到
2. Checksums detect corrupted data: TCP的header中包含了范围包括data和header的checksum来检查是否有数据被corrupted
3. Sequence number detects missing data: TCP的header中包含了这个segment的第一个byte的序列号
4. Flow-control prevents overrunning receiver: Receiver会以此告诉sender是否有足够的buffer空间来接受新的数据
TCP segment 格式
Destination Port:数据要送到哪个application
Source Port:告诉另一端的transport layer,如果要送回数据的话应该送到哪个application(A送到B的TCP segment里应该是A的port number)
Sequence Number:这个segment携带的data的first bit在整个byte stream中的位置(如果Initial Sequence Number是1000而这个是第一个segment,那sequence number就是1000。同时如果这个segment长度为500,那么下一个segment的sequence number是1500)
Acknowledgment Sequence Number:下一个segment的首位,同时说明这一位之前所有的数据都是确认无误接收到了(这个segment长度为750,ASN就是751,同时说明前750bits都是正确的)
Checksum:帮助检查corrupted data
HLEN:这个header的长度
Flag:判断这个segment是Fin,Syn还是其他的种类
TCP唯一的ID Unique ID of TCP
IP DA / IP SA / Protocol ID / Source Port / Destination Port 这五个区域共同作用于识别TCP链接
*Host A作为一个新连接的initiator,需要选择一个unique的source port ID
要保证它不会accidentally选择一个重复用在另一个connection的id
方法1:每次有新的connection需新的source port number,就increment(但是不安全,可能会用完,比如有一个存在时间很长的TCP segment,后面产生的新port number又从头开始,和它撞上了)
方法2:生成随机的ISN,来防止和其他链接的ID重复
当Host A初始化了一个到B的连接,它会发送一个A的Initial sequence number和一个Syn
同理B也会发送会一个B的Initial sequence number,一个Syn和一个Ack、
从A到B时的segment中的sequence number就是这段data的first byte
从B到A时的segment中的acknowledgment sequence number是这段data的下一个byte