|
什么是TCP
TCP全称位”传输控制协议(Transmission Control Protocol)“。
TCP是在传输层中
TCP是有连接的协议;”三次握手和四次握手 “
TCP是可靠的
TCP是面向字节流的
沾包问题
TCP的报文格式

源端口号和目的端口号:表示数据从哪个进程来到那个进程去。
32位序号和32位确认序号:TCP传输是面向字节流的且可靠的,会对每一个字节进行编号,确认序号;接收端收到了发送端的数据会返回该数据后一个序号,表示前面的数据以及收到,现在要从该序号开始发送(保证数据丢包之后可以知道);例如;发送端:发送了1001~2001的数据。接收端:应答的报文中的确认序号为1005,则表示1005之前的数据收到了,之后的数据没有收到,发送端则从1005序号的数据重新发送。
4位首部长度:描述TCP报头有都是个bit位(多少个字节)。比如:0101,表示该报头有15*4=60字节(可以通过4位首部长度对报头和有效载荷分离)
6位标志位:
URG:当发送端的报文中的URG标志位=1时,表示该数据非常紧急,则紧急指针有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
SYN:请求建立连接;我们把携带SYN标识的为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识位的为结束报文段。
16位窗口大小:发送端可发送的最大数据量。
16位校验和:提供额外的可靠性
16位紧急指针:标记紧急数据在数据字段中的位置
选项:参考资料
TCP的如何保证可靠性
确认应答(ACK)机制

超时重传机制

主机A发送给主机B的数据,可能因为网络拥堵等原因,数据无法到达主机B;
如果主机A在特定的时间间隔内没有收到主机B的的确认应答,则会重新发送

但可能是主机A未收到主机B的确认应答。
那么主机A也会重新发送,主机B就会收到大量重复的数据。为了不占用资源,主机B要把重复的数据丢掉。这个时候我们可以利用序列号来去重。
TCP为了保证无论在什么环境下都能有比较高的性能通信,会动态计算最大超时时间。
Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时
时间都是500ms的整数倍.
如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.
如果仍然得不到应答, 等待 4*500ms 进行重传. 依次类推, 以指数形式递增.
累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接
连接管理机制(三次握手和四次挥手)
三次握手
 |
|