TCP&UDP&IP协议详解
第十一章、TCP&UDP&IP协议详解
1.TCP协议详解
面向连接、可靠的、字节流服务
1.面向连接
在服务器与客户端通信,之前必须通过三次握手建立连接,之后必须通过四次挥手断开连接
1.1. 三次握手过程
Q:为什么要三次握手,两次行不行,四次有必要吗?
还有SYN溢出攻击:客户端不断发信息,然后关闭客户端,就会把服务器端的资源耗尽。
四次握手没有必要,四次握手就是将ACK和SYN分开传输,没有必要。
1.2. 四次挥手过程+状态转换图(TIME_WAIT、CLOSE_WAIT)
Q1:为什么要四次挥手?
A:因为socket通信是全双工的
Q2:必考题:为什么主动断开方没有直接进入到CLOSED,而是有一个TIME_WAIT状态?
A:1.保证迟来的数据能够被识别并丢弃。
2.保证可靠的终止TCP连接–保证最后一个ACK能够传输到被动断开方。
测试过程:先结束服务器端,然后再次启动服务器端,发现启动失败
大概两分钟后,time_wait状态结束,可以重新启动:
1.3.网络命令 (ifconfig、netstat、ip、ss)
1.4. 同时断开连接
1.5. 状态转移图
详见:linux高性能服务器编程
2.可靠性传输
1. TCP报头结构
2. 应答确认与超时重传
3. 32位序号
根据TCP报头中的32位序号,通过排序和去重实现数据的不重复、不乱序!
4. 16位校验码与CRC冗余校验
用TCP报头中的16位校验码进行冗余码算法校验,来保证数据不失真!(对TCP头部和数据部分都会进行校验)
5. 滑动窗口
真正的发送窗口是在滑动窗口和拥塞控制窗口之间取最小值
5.1. 滑动窗口机制
5.2. 零窗口
零窗口探测报文段
5.3. 糊涂窗口综合症
5.4. Nagle算法
6. 拥塞控制
控制发送方发送数据的速率与当前网络状况的匹配.
1.慢启动(拥塞未发生时使用)
2.拥塞避免(拥塞未发生时使用)
3.快速重传(拥塞发生后使用)
4.快速恢复(拥塞发生后使用)
3.字节流服务(容易引发数据包粘包问题)
TCP字节流的特点,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的。
1.发送方send与接收方recv没有直接的数量关系
2.网络中传输与接收方的数据都不会因为send的次数而被分隔开—数据是一个整体,中间是没有分隔的!!
2.UDP协议详解
1.UDP报头结构
2.数据报服务
3.IP协议详解
网络层的任务:数据报的选路、转发
1.IP协议特点:无连接、不可靠、无状态
2.IP报头结构
3.IP分片
超过MTU的IP数据报可以被分片传输(分开的是IP数据报的数据部分,IP部分要复制给每一个分片)