7/23
三.TCP协议详解
3.1tcp服务的特点
- 传输层协议有两个tcp和udp,tcp相对udp协议特点是:面向连接,字节流和可靠传输
- tcp协议通信双方都必须为连接分配必要的内核资源,用以管理连接状态和数据传输,tcp连接是全双工的
- tcp协议连接是 一对一的
- 字节流服务:应用程序对数据的发送和接收没有边界限制。
- udp是数据报服务,发送端应用程序每一次写操作都会封装成一个udp数据报并发送,接收端必须执行读操作,否则就会丢包。
- 两者区别:在实际编程中体现为通信双方是否执行相同次数的读写,tcp协议,当发送端应用程序连续执行多次写操作,tcp模块先将数据放到tcp发送缓冲区,当开始发送时,发送缓冲区将数据封装成一个或多个tcp报文段发出。tcp下,读写没有固定关系
- 可靠性:tcp采用发送应答机制,即发送端每一个tcp报文段都必须接收到应答。tcp协议采用超时重传机制,即发送端发送出一个tcp报文段之后启动定时器,如果定时器时间内未收到应答,tcp协议会对tcp报文重排,整理,再交付应用层。
3.2TCP头部结构
- 16位源端口号:告诉主机报文段来自那个端口号以及上传给那个上层协议或应用程序
- 32位序列号:一次TCP通信过程中,某个传输方向上字节流的每个字节编号。例如A和B主机通信,A发给B的某个tcp报文段,序号被初始为随机值ISN,后续tcp报文段序号值设置为ISN加上携带数据的第一个字节在整个字节流的偏移。
- 32位确认号:用作另一方发送来的TCP报文段响应。
- 4位头部长度:标识TCP头部有多少个32bit字最多标识15*4字节
- 6位表示位:
-
- URG:表示紧急指针是否有效。
-
- ACK:表示确认号是否有效。
- PSH:表示接收端立即从TCP接收缓冲区拿走数据。
- RST:表示要求对方重新连接,称为复位报文。
- SYN:表示请求一个连接,称为同步报文。
- FIN:表示通知对方本段即将关闭,称为结束报文。
- 16位窗口大小:TCP流量控制窗口,指接收通告窗口,告诉对端本段TCP接收缓冲区还能容纳多少数据。
- 16位校验和:由发送端填充,接收端用CRC算法校验TCP报文段在传输中是否损坏,是TCP可靠传输的重要保障。
- 16位紧急指针:TCP紧急指针是发送端向接收端发送紧急数据的方法
3.2.1头部选项
kind(1字节) | length(1字节) | info(n字节) |
---|
- kind=1:表示结束选项
- kind=2:表示空操作
- kind=3:窗口扩大因子,TCP初始化时双方通过该选项协商接收通告窗口的大小是N,窗口最大因子M,则N*(2的M次方)
- kind=4:选择性确认(SACK)选项,使TCP模块只发送丢失的TCP报文段
- kind=5:SACK实际工作选项,告诉对端,本端接收并缓存的不连续数据块,从而让对端据此检查并重发丢失的数据块。
- kind=8:时间戳选项
3.3TCP连接的建立和和关闭
3.3.1三次握手四次挥手
三次握手
- 报文段1:含有SYN标志位,表示是个同步报文,请求连接,序列号seq是ISN值为535734930的序号
- 报文段2:含有SYN标志位,表示是个同步报文,确认号是上一次对端序号加1,ack值为535734931,本身序号seq为2159701207。
- 因为同步报文比较特殊,没有数据,故只是加1.
- 报文段3:对报文段2的确认ack为2159701208
四次挥手
- 报文段4:含有FIN标志位,表示是个结束报文。
- 报文段5:对报文段4的确认
- 报文段6:含有FIN标志位,表示是个结束报文。
- 报文段7:对报文段6的确认
3.3.2TIME_WAIT状态
客户端接收到结束报文段进入time_wait状态,而不是closed状态,客户端要等待2MSL时间才能完全关闭,标准文档PFC1122建议值2min。
time_wait状态的原因
- 可靠的终止TCP连接
- 保证迟到的TCP报文能被识别并丢弃,在linux下一个TCP端口不能被同时被多次打开,一个TCP连接处于time_wait状态时,不能立即使用该连接占用的端口建立连接。因为要确保下一个连接不能接收到上个连接的TCP报文段。
3.3.3交互数据流和成块数据流
交互数据流:因为交互数据流在广域网上可能受很大的延迟,且微小tcp报文段数量很大,这些因素都可能发生阻塞。用Nagle算法,
即TCP通信双方在任意时刻都只能发生一个未被确认的数据报,在确认到达之前不能发送,同时收集微小数据报,在确认到达时一次发出。
成块数据流:发送端一次发送读个TCP报文段,其数量取决于接收端的接收通告窗口大小决定。接收端一次全部确认这些报文段。
|