TCP:
伪头==12:仅参与校验和,成员totallen不包括伪头部.
sourceip(32)
destip(32)
res(8) protocol(8) totallen(16)
报头>=20bytes.
sourcePort(16) DestPort(16)
seq(32)
ack_seq(32)
hdrlen(4) res(6) urg/ack/psh/rst/syn/fin win(16)
checksum(16) urgpoint(16)
options(0~40bytes即0~320bit)
选项最大长度:tcp首部长度hdrlen范围是2^4-1=15个32bit.即60bytes,减去固定长度20bytes,得选项最多40bypes.
选项部分必须为8bit整数倍,这样才符合RFC文档要求.
选项:kindle(8) length(8) info(16).
TCP选项:
MSS(maximum segment size)最大报文传输段(数据报不分片的最大值):32bit数据部分字段(不包括TCP头).
应用层往TCP层写数据时,若TCP发送缓冲区满,但还没write完,内核便将write系统调用挂起;TCP发送缓冲区满或网络空闲时,缓冲区数据便被通过ip层发送到链路层发送队列中;发送缓冲区数据成功发送(包括重传等情况)后,才唤醒write.而ip分片会导致TCP重传可能性增大,此时ip层再分片,将可能导致write一直挂起,性能下降.
MSS=MTU-TCP头部大小-IP头部大小=data.
ip层的MTU(maximum transfer unit) = ipHeader+tcpHeader+data;
SACK(selective acknowledgements)选择确认选项.34bytes
目的是为了不重传已经正确到达的数据.eg:A发送1,2,3,4,5数据,B接收到1,3,5,而2,4丢失.不启动SACK,A从2开始重传;启动SACK,A只重传2,4.
tcp首部options最多40bytes,而指明一个序列号边界需4bytes,一个报文需要2个边界:如2丢失,需要1,3序列号指明.故需要8bytes.因此最多指明4个丢失报文.(因为还需要2个功能字节,故40/8-1=4).这个选项大小是34bytes.
时间戳选项(timestamps).10bytes.
1,用来计算往返时间RTT.发送方在放松报文前放入当前时间,接收方只需在应答时复制该时间戳即可,以便发送方计算RTT.
2,PAWS防止回绕的序号:众所周知,32bit序列号在数据超过2^32便会重复.在高速网络(如1Gb/s),则几秒便会重复,从而可能带来传输的混乱.启用时间戳选项后,可以很容易的分辨出相同序列号的数据报先后顺序.
NOP(no operation):2bytes
这个字段实际上没有任何意义,它用于提供填充垫片.TCP头部必须是4bytes的倍数,但options则通常不满足.如果不满足,则需要使用NOP进行填充使之符合tcp的头部构造规定.
NOP也用作分割选项.如我们使用了窗口扩大选项和SACK,那么必须使用NOP进行隔离.
窗口扩大选项(window scaling):TCP最大窗口64Kb,对于时延和带宽都大的通信不能满足性能和高吞吐量,于是窗口扩大选项产生.
窗口扩大选项占3bytes,第一个byte表示移位值S.表示win左移S bit.在tcp握手时协商从而扩大,后续如果改为0,则回复win的16bit大小.S最大值是14,因此win最大是65535*2^14=1GB.
拥塞窗口cwnd(congestion window):发送方维持一个动态变化的拥塞窗口,大小取决于网络拥塞程度.
发送方的发送窗口<=拥塞窗口.一般两个窗口相等.
网络好,从而拥塞窗口较大时,由于接收方接收能力有限,从而发送窗口达到一定值不再发生变化.
网络拥塞:发送方发送一些报文段,没有在一定时间内接收到确认报文,可认为网络拥塞.
慢启动算法:为了防止网络拥塞,cwnd=1,发送报文后收到确认报文,则cwnd*=2;
拥塞避免:慢启动算法还是增加过快,容易导致网络拥塞.因此加了个状态变量:慢开始门限ssthresh
当cwnd < ssthresh时,使用慢启动算法
当cwnd > ssthresh时,使用拥塞避免算法.
拥塞避免算法:每次往返 cwnd+1,而不再翻倍.cwnd此时增长比慢启动慢的多.
拥塞避免算法之一:AIMD算法:和式增加,积式减少.
积式减少:网络一旦出现超时:ssthresh=cwnd/2,cwnd=1,执行慢启动算法.(cwnd
快重传算法:
发送方发送1,2,3,4,5,6,7,8,9,10,...连续收到3个确认4后,不必再等待超时,直接从5开始重发.
5丢失...
接收方接收到1,2,3,4,6(确认4),7(确认4),8(确认4),9(确认4)...
快恢复算法:
发送方连续收到3个确认后,执行积式减少:ssthresh=cwnd/2,此时cwnd/=2,开始执行拥塞避免算法,拥塞窗口cwnd缓慢增大.
UDP头部:
源端口(16) 目的端口(16)
长度(16) 检验和(16)
data
注:检验和全0表示不使用检验和.
UDP是否和TCP一样分片?UDP不需要保证可靠,因此没有发送缓冲区,在应用层调用write时,数据直接传输到ip层.由于ip层也没有缓冲区,数据直接写到链路层的输出队列中.如果UDP数据报大于链路层MTU,ip层就会分片,再发送到链路层输出队列.
公认的服务端口:
ftp 21
telnet 23
smtp 25
gopher 70
http 80