TCP主动关闭连接,先发finish的,会处于timewait状态,因为万一另外一端收不到最后一个ack,另外一端回重发finish,让它重发ack,但是如果想要立马重新使用处于timewait状态的服务,需要设置socket的属性为reuse。
三次握手需要确认两边sequence起始值,以及窗口大小和mss,一个消息最大多大。
TCP的sequence num是按照字节来的。
弱网情况下,TCP如果超时定时器是200ms,如果第一次没收到ack,就等200ms重传,如果重传还没收到ack,就等400ms,200的x次方,一直等到最大超时时间,例如120s,直接断开连接,对实时性有要求的话,不能用tcp。
udp不通的情况下,可以用tcp,tcp的网络联通性比udp要好的多。
tcp连不通的时候,可以尝试用更上层的https尝试下。
对于视频:
rtp同一帧数据,时间戳一致。
rtp mark位为1,代表拆包后一帧的结束。
对于音频:
mark位为1,表示一帧的开始。
rtp :csrc为共享源,有几个人混音,就有几个csrc,这里填其ssrc?cc代表有几个csrc。
x是扩展位。
rtp中p为padding位,最后一个字节是补了多少字节,从后往前去掉这些字节就是实际的内容。
为啥音频的rtp包每帧mark位都置为1,因为音频数据太小,一个rtp包就能放得下。