TCP/UDP

TCP与UDP的相关知识

  • TCP的三次握手具体发生在哪个函数中
    • 补充知识:

TCP的三次握手具体发生在哪个函数中

在Linux编程中,在进行TCP网络编程时,通常分为客户端和服务器端两个模块.
客户端:

  1. fd=socket(); //利用socket生成文件描述符fd;
  2. bind(); //利用bind进性端口绑定(这里也可以不进行绑定,不绑定则随机分配,由于客户端不需要特定的端口,所以一般不进行绑定)
  3. newfd=connect(); //利用connect函数向服务器发送请求,请求成功后会返回一个新的文件描述符
  4. send(newfd,buf,length,0);//利用newfd向服务器发送数据
  5. recv();接收服务器发来的数据

服务器

  1. fd=socket(); //利用socket生成文件描述符fd;
  2. bind(); //绑定服务器对外提供的端口
  3. listen();设置服务器监听的客户端的数量,主要是为了防止恶意请求对Linux内核性能的破坏,下面会具体说
  4. clientfd=accept();//接受客户端请求,返回客户端fd,以供服务器与客户端建立连接
  5. send();recv();//与客户端类似

三次握手
TCP/UDP_第1张图片
上图展现了TCP三次握手的基本架构,那么TCP三次握手具体发生在客户端与服务器端的哪个函数中呢?
我们都知道客户端是利用connect函数向服务器端发送通信请求的,所以在tcp三次握手中,第一次握手是由客户端中的connect函数引发的。
在服务器端,当收到客服端的连接请求时,会为其分配相应的文件描述符并将其存放在一个请求队列中,也就是图中的syn队列,此时请求队列中的文件描述符暂时还不能用于通信(没有完成三次握手)。之后服务器会回复确认信息给客服端(第二次握手),最后客户端会回复一个确认信息给服务器端(至此三次握手结束),当服务器收到客户端的确认信息后,会将对应客户端的fd,从请求队列中取出放入另一个队列中,也就是图中accept队列,之后服务器端的accept函数会从accept队列中取文件描述符与相应客户端进行数据通信。也就是说其实服务器端对应的函数并没有参与tcp三次握手,仅仅在三次握手结束后,利用已经完成三次握手的客户端文件描述符进行通信。
**

补充知识:

**
在服务器端listen函数的作用
listen函数主要是为服务器设置最多客户端连接数,也就是上述说的syn队列的大小,有人肯定说为什么要设置限制,无限多不是更好,事实上并不是这样,因为如果设置了无限,当有人想要攻击服务器,就可以向服务器不断发送通常请求(也就是第一次握手),服务器随后发送确认信息给客户端(第二次握手),但客户端并不给服务器确认信息(第三次握手),这就导致了,服务器的请求队列越来越长,占用大量的系统内存,降低系统性能,而且系统中文件描述符的数量是有限的,大量的文件描述符被占用,也将导致其他程序无法进行。

你可能感兴趣的:(笔记)