TCP协议

                                           TCP协议

TCP网络编程


大纲:
TCP
面向连接 字节流   可靠传输
   | 优化算法Nagle        |
3次握手 无消息保护边界 确认应答 - TCP头部结构(头部的选项讲解一下扩大因子3和最大报文长度2)-PSH以及窗口大小-TCP数据(交互数据&成块数据)
4次挥手       超时重传       |-紧急指针 URG-带外数据
状态转移      |
复位报文 拥塞控制(滑动窗口+算法控制)-4个阶段
         

TCP特点:面向连接、字节流、可靠传输
send recv次数与TCP报文段个数没有固定的关系(字节流的概念),这与UDP相反,UDP
必须sendto就要recvfrom否则丢包。
TCP的应答机制超时重传表现了可靠传输,而UDP则需要上层协议帮助完成。


TCP头部结构:16位源端口号,16位目的端口号,32位序号,32位确认号,4位头部长度,6位保留
6位标志位(ack,syn,fin),16位窗口大小,16位校验和(可靠传输重要保障),
16位紧急指针,最多40字节的头部选项(kind,length,info)。


TCP连接的建立和关闭:
三次握手四次挥手状态转移图

复位报文段RST
1对方没有这个端口程序,回复复位报文段接受窗口大小为0,只能重新连接或者放弃
对方处于TIME_WAIT状态会回复同样复位报文
给对方发送复位报文异常终止连接,socket设置SO_LINGER
2处理半打开连接:服务器异常关闭,客户端没有接到结束信息,服务器重启
但是连接对于服务器而言不存在这种叫半打开。对于客户端信息他会回复复位报文

TCP交互数据流
交互数据&成块数据
交互数据:数据量小,实时性高telnet,延迟确认。
成块数据流:FTP,大数据文件,发送方可以未经确认持续发送,因为对方确认一次以后,服务器(客户端)
能够通过窗口大小判断对方是否还能接受成块数据流,窗口大小/成块数据流规定长度,如果
为0,就停止了,在停止之前会在这些数据流头部点亮PSH标志位。

带外数据:具有高优先级的数据,不考虑缓冲区直接发送。
UDP没有实现,TCP也没有真正实现。他通过紧急指针来模拟了相同的功能。

拥塞控制(nagle):
慢启动,拥塞避免,快速重传,快速恢复。
接收端的delay ack机制就是等待数据和ack一起发送,超时就字节发送ack。
我们的SWND=min(CWND,RWND)。
nagle算法的tcp拥塞窗口CWND控制方法
nagle算法就是为了尽可能的避免网络小包以防止网络拥塞,TCP_NODELAY关闭默认的nagle算法。
此算法会在收到ack确认以后发送第二个包网络中必须保证只有一个包(<MSS)存在。
 慢启动:CWND大小随指数增加CWND+=min(N,SMSS)N是上次没确认的字节数(单位是SMSS(一个TCP报文长度))//该模式一开始是1,返回一个ack,++变成2,返回两个ack,++再++
变成4,可以看出慢启动状态是指数增长的。
 拥塞避免:设置门限为ssthrest,CWND+=SMSS*SMSS/CWND没收到一次确认使用这个公式。那么可以看出收了ack共n个,++n次,其实就是+1增长。还有另一种方式就是每个RTT之后都要经行一次拥塞避免。
 如果发生了传输超时:ssthrest=max(flightsize/2,2*SMSS),CWND<SMSS。可以看出这时候重新进入慢启动阶段并降低了拥塞避免的门限。
 快速重传和快速恢复(收到3个重复的确认报文):现根据如上降低ssthrest,CWND=ssthrest+3*SMSS。立即重传重传丢失报文,每收到一个重复报文ack,CWND+=SMSS。
当接收到新数据恢复,就说明重传报文成功了即进入快速恢复,CWND=ssthrest及拥塞避免阶段。




TCP的大包小包问题(TCP粘包)
发送端可以选择发送大包和小包,接收端也可以控制接收几个包。也就是说粘包问题可能由于client也可能是service
*粘包问题有两种,包内全是完整的包,包内有不完整的包。
  避免:发送端通过push强行刷新发送缓冲区。接收端合理设置减轻接收缓冲区工作量。
  封包拆包:就是在封包时候设置一个结构体放在数据头部,结构体中有记录包体长度的变量成员。
当我们拆包的时候,解析出来这个结构体的包头长度,按长度换算出下一个包头位置再一一解析进行拆包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值