传输层:
- 负责数据能够从发送端传输接收端。
端口:就是代表一个唯一进程。
端口号范围划分:(uint16_t)
0 - 1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的。
1024 - 65535:操作系统动态分配的端口号,客户端程序的端口号,就是由操作系统从这个范围分配的。
常见的两个问题:
- 一个进程能否绑定多个端口号。——可以
- 一个端口能否被多个不同的进程绑定。——通常情况不可以,
知名的端口号:
- ssh服务器,使用22端口——虚拟机连接就是这个端口
- ftp服务器,使用21端口——用于传输文件
- telnet服务器,使用23端口
- http服务器,使用80端口
- https服务器,使用443端口
查看知名端口号的命令:cat/etc/services
UDP协议端的格式:加上八字节就是UDP协议端
md5sum 命令特别差用,把md5当作校验和来使用。
有没有可能出现两个不同的原串,md5值相同?
理论上是存在。但是在工程上不考虑。
TCP协议
重要的TCP状态 :
- LISTEN :手机开机信号良好
- ESTABLISHED:连接建立成功,可以进行通信
- CLOSE_WAIT:在断开连接时内核回复ACK的时候,等待执行 close() 函数。服务端有大量CLOSE_WAIT 是因为忘记调用close。
- TIME_WAIT:过一会儿再进行close,为了防止最后一个ACK 丢包,保证丢包之后还有机会重传。及时客户端进程退出了,TIME_WAIT状态还是存在的,如果最后一个ACK丢了,对端的重传的FIN有机会去处理它。
保持可靠性机制——滑动窗口机制:(快重传)
丢包情况:
丢包情况二中:丢包之后到重发之间,这些数据接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中。
快重传和超时重传的本质是一样的,借助确定序号的特点,做到只重传丢的那部分数据,其他的正确到达,无需重复传输。
流量控制:(图中所示是单单是流量控制变化情况)
真实的窗口大小控制是流量控制和拥塞控制的窗口大小的较小值。
拥塞控制:
延时应答机制:(提高传输效率)
具体延时多少???
- 数量限制:每隔N个包就应答一次
- 时间限制:超过大延迟时间就应答一次
捎带应答机制:(提高传输效率)延时应答的基础之上引入的机制。
面向字节流:
创建一个TCP的socket,同时在内核中创建一个发送缓冲区 和一个 接收缓冲区。
粘包问题:
TCP的异常情况:
- 进程终止:进程终止会释放文件描述符,仍然可以发送FIN. 和正常关闭没有什么区别。
- 机器重启:和进程终止的情况相同。
- 机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset。即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在。如果对方不在,也会把连接释放。
- 另外,应用层的某些协议,也有一些这样的检测机制。例如HTTP长连接中,也会定期检测对方的状态。例如QQ,在QQ 断线之后,也会定期尝试重新连接。
TCP和UDP对比:
- 如果需要可靠性(比如外网的复杂环境),优先考虑TCP。
- 如果网络机构本身简单,考考行比较高,对传输效率要求高,优先考虑UDP。
- 如果传输的数据比较大,TCP(UDP的包最大长度64K)。
- 如果需要广播的话,只能用UDP,TCP不能广播。