字节爱问
TCP三次握手四次挥手
客户端先发送请求
- TCP建立连接的过程
- 《闪电》《确认》
* 传输层向上面的应用程序提供通信服务
* 第一次握手
* client发送连接请求数据报文到server端 SYN_SENT状态
* 第二次握手
* server收到连接请求数据报文,如果同意建立连接,向client回应确认报文端
* (为TCP连接分配TCP缓存和变量)
* 第三次握手
* client收到server收到确认之后,它再次向服务器端发送确认报文端
*
问:为什么建立三次握手,可以两次吗?
肯定不可以,举一个场景,client发送了一个请求1,发过去以后没有及时到达到server端
,client端等不及了又发送了一个一模一样的请求2,于是请求2先到达server端了,连接成功建立,通信后断开连接。此时请求1才刚到, 如果没有中间那次握手来确认的话,就会重复处理,所以需要中间一次的确认握手。
- TCP断开连接的过程
- 《大于小于》《还没完》
* 第一次挥手
* client发送一个断开连接请求数据报文到server
* 第二次挥手
* server收到断开连接请求数据报文之后,只是回应确认报文端
* 第三次挥手
* server发送一个关闭连接请求数据报文到client
* 第四次挥手
* client发回ACK数据报文确认
*
* TCP提供面向连接的服务,在传输数据之前必须要建立建立,数据传输之后还需要
* 释放连接,TCP产生的额外开销会比较大,如:确认机制、流量控制、拥塞控制机制需要
* 占用处理器资源
问:可以改三次挥手吗?
不可以,服务器端收到断开请求后,缓存区都东西还没发完,如果直接断开会造成数据丢失。
UDP编程
* TCP提供面向连接的服务,在传输数据之前必须要建立建立,数据传输之后还需要
* 释放连接,TCP产生的额外开销会比较大,如:确认机制、流量控制、拥塞控制机制需要
* 占用处理器资源
*
* UDP协议
* 1)UDP是无连接
* 2)UDP尽最大能力交付
* 3)UDP面向报文
* 4)UDP没有拥塞控制
* 5)UDP首部开销小(只有4个字段 源端口 目的端口 长度 校验和)
*
* UDP编程
*
* TCP和UDP的区别
* TCP:面向连接、可靠的、流式服务
* UDP:无连接、不可靠的、面向报文的服务
* 流式服务:数据是一个数据流,数据没有界限,数据的发送和接收存在直接的联系
* 面向连接、可靠:
* 1)应答确认机制 & 超时重传机制
* 2)保证有序,每一个TCP数据报文都会有序号
* 3)接收的数据和源数据完全相同,数据没有损坏
* TCP和UDP的区别
* TCP:面向连接、可靠的、流式服务
* UDP:无连接、不可靠的、面向报文的服务
* 流式服务:数据是一个数据流,数据没有界限,数据的发送和接收存在直接的联系
* 面向连接、可靠:
* 1)应答确认机制 & 超时重传机制
* 2)保证有序,每一个TCP数据报文都会有序号
* 3)接收的数据和源数据完全相同,数据没有损坏
public class MyUDPServer {
public static void main(String[] args) {