文章目录
- 报文格式
- 连接管理
- 可靠传输
面向连接的传输层协议
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
TCP提供可靠有序,不丢不重
TCP是面向字节流的
TCP工作模型:
发送方有一个缓存,缓存:
1.待发送
2.已发送但未得到确认
接收方也有一个缓存,缓存:
收到但未确认的
不按序到达的
TCP提供全双工的通信方式
报文格式
MSS:Maximum Segment Size,一个TCP报文中最大可携带多少有效数据
数据偏移:首部长度,4B为单位,有4位,表示TCP首部长度,所以TCP首部长度范围在20B到4*15=60B
连接管理
三个阶段:
连接建立-数据传送-连接释放
方式:
客服/服务器方式,主动发起连接的叫客户,被动等待连接建立的叫服务器
客户和服务器都是进程
连接建立:
三次握手
有件事不知当讲不当讲 (询问)
当讲你说吧 (确认)
好的,,巴拉巴拉 (对确认再确认)
ROUND1:
客户端发送连接请求报文段,无应用层数据
SYN=1,seq=x(随机)
ROUND2:
服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据
SYN=1, ACK=1, seq=y(随机), ack=x+1
ROUND3:
客户端为该TCP连接分配缓存和变量,并向服务器返回确认的确认,并可以携带数据
SYN=0,ACK=1,seq=x+1, ack=y+1
SYN洪泛攻击
连接释放:
四次挥手
我说完了
好的那我想说巴拉巴拉
好我也说完了
好的
ROUND1:
FIN=1, seq=u
ROUND2:
ACK=1, seq=v, ack=u+1
经过ROUND1和ROUND2,已经单方面断开了A到B的连接,A已经不能向B发送数据了,但B还能向A发送数据
ROUND3:
FIN=1, ACK=1, seq=w(w取决于ROUND2之后服务器端又发了多少), ack=u+1
ROUND4:
客户端回一个确认报文段,再等到2MSL(最长报文段寿命)后,连接彻底关闭
ACK=1,seq=u+1,ack=w+1
但是不一定非要首先客户端去释放连接,也可以服务器首先去释放连接,但是发起连接必须要客户端去发起
ACK报文,握手3,挥手2,挥手4,还有数据传输中的确认报文(你传过来一个,我回一个确认报文),这些确认报文,都不消耗序号
可靠传输
网络层提供的是best-effort,不可靠传输,那么传输层,就要用TCP协议实现可靠传输
校验
报文格式里的校验字段
序号
序号字段
确认
确认报文段
如果由于传输速度等原因失序,那么会发送应到达的报文的确认报文,然后发送方收到以后知道失序,重传
重传
TCP的发送方如果在规定时间内没有收到确认,就要重传已发送的报文段,
重传时间,如果过短,就会导致有些报文还没到就要重传
如果过长,网络空闲又过大
自适应算法RTTs(加权平均往返时间)
冗余确认(冗余ACK)