一、传输层概述
复用:发送方不同的应用进程都可以使用同一个传输层的协议来传送数据
分用:接收方的传输层在去除报文段的首部之后能把数据交给正确的应用进程
熟知端口号就是知名端口号0-1023
客户端使用的端口号是动态变化的,不是唯一确定的
端口号是16位65536
套接字可以标识一个端点:具体主机的具体进程
ftp:21 telnet:23 smtp:25 dns:53 http:80
二、UDP用户数据报
链路层有一个MTU的要求
UDP不确保数据的可靠交付,只提供了复用分用和差错检测的功能,出现问题应用层自己去解决
udp首部8个字节(源端口、目的端口、UDP的整个长度、校验和),tcp首部20个字节
源端口号可以不填(如果不需要对方回复的话) ,目的端口肯定要填
分用的时候,如果没有对应的端口号,就丢弃报文,返回给发送方一个ICMP“端口不可达”差错报告报文
伪首部只有在计算校验和的时候才出现,既不上传也不下发
伪首部的udp长度字段指的是udp的首部8B+udp数据部分的长度(不包含伪首部的长度)
我猜它不考:
三、TCP可靠数据传输
每一条TCP连接只能是点对点/一对一的,无法用于广播/多播的通信方式
TCP提供可靠的数据传输:可靠有序,不重不丢
TCP提供全双工通信:发送缓存和接收缓存可以同时工作
TCP提供的是面向字节流的服务:把应用程序交付下来的数据看成一串没有结构的字节流
填充字段的作用:保证TCP的段按4字节对齐
面向连接:收到一个报文段就要回复一个确认,回复的是下一个希望收到的序号,同时向发送方表面在这个序号之前的报文段我都收到了
为什么要通过数据偏移来获取数据部分从哪开始的?
》因为除了20字节的固定首部,还有可能加了选项字段
SYN和SIN用于连接的建立和释放
紧急指针的目的是为了标识紧急数据所在的位置
四、三次握手四次挥手
服务/客户端都有发送和接收缓冲区
ACK=1,ack的编号才有意义
为什么要等待2MSL:如果最后一个ACK=1,seq=u+1,ack=w+1丢失了,服务端没有收到,就会一直给客户端发送一个FIN=1,ACK=1,seq=w,ack=u+1,无法进入最后的CLOSED状态
一个字节占一个序号,序号字段指的是报文段的第一个字节的序号
TCP采用累计确认
3个冗余ack之后,直接启动快速重传
五、TCP流量控制与拥塞控制
TCP重点考察拥塞控制和流量控制
如何打破互相等待的死锁局面?
收到对方的零窗口通知就启动一个持续计时器,然后,每隔一段时间发送一个探测报文段
流量控制是一个点对点的问题,而拥塞控制是一个全局性的问题
快恢复:降到一半开始线性增加