1、运输层的端口号
端口号有16位,共65536个端口,从0开始计数。
系统端口号范围是0-1023;登记端口号范围是1024-49151;短暂端口号范围是49152-65535;
可以计算出,系统端口号高六位一定是“000000”;短暂端口号高二位一定是“11”;其他是登记端口号。
2、运输层协议
传输控制协议TCP: Transmission Control Protocol
用户数据报协议UDP: User Datagram Protocol
TCP是面向连接的全双工通信,开销比UDP大
UDP首部8字节,TCP的固定首部20字节、选项最长40字节
UDP支持一对一、一对多、多对一、多对多的交互通信。
UDP检验和检验首部和数据部分,TCP检验和只检验首部,检验和占2字节
TCP报文的数据部分是字节流
---------------------------
TCP传输
1、停止等待协议。发送方发送的数据包必须排序,且按顺序发送数据包,接收方在接收到分组后发送确认分组。发送方每发送完一个分组报文,都必须暂时保留这个分组的副本,如果在规定时间内没有接受到接收方的确认,就需要进行超时重传。接收方在收到重复的分组时直接丢弃重复分组、发送方在收到重复的确认时直接丢弃重复确认(这是出于确认丢失、确认迟到的考虑)。
缺点:信道利用率太低。
2、连续ARQ。发送方需要维持一个发送窗口,位于发送窗口内的分组都可以连续发送出去而不必等待对方确认。接收方采用累积确认,对按序到达的最后一个分组发送确认。接收方会维护一个接受窗口。
--------
超时重传时间选择
报文段往返时间RTT
加权平均往返时间RTTs
往返偏差加权平均值RTTd
超时重传时间RTO
RTTs=RTT
RTTd=1/2*RTT
新的RTTs=(1-a)*旧RTTs+a*新RTT
新RTTd=(1-b)*旧RTTd+b*新RTTd
RTO=RTTs+1/4*RTTd
RFC2988建议a取值1/8,b取值1/4
改进的Karm算法:报文没重传一次,RTO增大一些(2倍),不再发生重传时再按公式计算RTO
-------------------
选择确认SACK(Selective ACKnowledge)避免重复发送已接收分组,需要在链接建立时增加SACK选项
--------------------------
零窗口报文后的非零窗口丢失解决方式:发送端收到零窗口报文后设置持续计数器,定时发送零窗口探测报文段。
-----------------数据传输效率:Nagle算法
----------------------------------------------------
Java中TCP编程接口java.net.Socket;UDP编程接口java.net.DatagramSocket