TCP和UDP
1.TCP和UDP的形象举例
TCP
例子:饭店的门口有一个迎宾人员,这时莫个人X去吃饭,被迎宾人员接待交给服务员,服务员为这个X提供各种服务
- X -》某个客户端
- 迎宾人员 -》listen的端口
- 服务人员 -》accept接受后的端口
-
sever端
// 迎宾人员 -- client -》为迎宾人员确定服务地点,并告诉她进行迎宾,可以有多个迎宾人员 fd = socket(); bind(ip,port); listen(); -》listen的过程是被动的,c/s的三次握手也是发生再次,确认连接之后,进入accept过程; -- listen的过程不会影响后续的操作,或者说它是非阻塞的 // 服务员 -- client -》进行各种服务,结账close亦如此 client = accept(); recv(client); send(client); close();
-
client端
// 吃饭的人 fd = socket(); bind(); -》optional可选项; addr;-》准备吃饭的地址; connect(addr); send(); recv(); close();
UDP
例子:UDP和TCP的不同就是,UDP的饭店是个小饭店,迎宾的人和服务的人是同一个人 -》这就代表了UDP服务器只有一个端口进行工作
-
sever端
fd = socket(); recvfrom(fd, addr, buffer, length, 0);-》接受信息的时候,会把client的地址传出来,对于一个客户端来说 sendto();
-
client端
fd = socket(); recvfrom(fd, addr, buffer, length, 0); sendto();
-
如果想要使用UDP服务器进行多个客户端的并发,应该怎么办?
- 模拟TCP通信,创建一个fd,服务client
- 可以在应用层和传输层UDP之间增加一个协议,保证并发连接
- 为什么使用增加协议头不行呢?
- 这种方法有个前提:先发先到,具有顺序
- 不可以,在公网下,数据链路层是把数据进行分组发出,中间经历多次路由,并且UDP是不会对数据的连接负责,即不能保证数据的接收是顺序的,因此对于多个客户端对应一个端口,所有数据是无序的,也就找不到其协议头 -》也就无法从应用层上确定发过来的数据是谁的;
- 模拟TCP通信,创建一个fd,服务client
socket的理解
socket = fd + (sip、dip、sport、dport、tcp/udp)
即文件描述符+网络配套资源(五元组)的一套插座组合
- 可以看作一个客户端
- 具有IO的某些属性