三次握手内部实现原理

打印 上一主题 下一主题

主题 884|帖子 884|积分 2652


          socket()创建一个新的套接字
    int socket(int domain, int type, int protocol);
    参数:
    domain:地点族,如 AF_INET(IPv4),AF_INET6(IPv6)
    type:套接字范例,如 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
    protocol:协议范例,通常为 0(默认协议)
    返回值:成功返回套接字描述符,失败返回 -1
   
   
    Linux操作系统流行一句话,“齐备皆文件”,这里的文件不是说文件系统,磁盘里的某个文件,而是struct flie
   
    也就是说,socket也其实也是一个struct file,将socket的所有底层都抽象为一个socket
   
   
   
    bind()就是将套接字绑定到一个本地地点(IP+端口)
    具体操作也就是将IP和端口号赋值到socket对象的成员内里去
    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    参数:
    sockfd:套接字描述符
    addr:指向 struct sockaddr 范例的指针,包含要绑定的地点信息
    addrlen:地点长度,通常为 sizeof(struct sockaddr_in)
    返回值:成功返回 0,失败返回 -1
   
   
    listen()将套接字设置为被动监听模式,准备接受毗连哀求
    int listen(int sockfd, int backlog);
    参数:
    sockfd:套接字描述符
    backlog:等待毗连队列的最大长度
    返回值:成功返回 0,失败返回 -1
   
    Listen()函数的最主要作用就是:初始化半毗连队列(哈希表) + 全毗连队列(链表)
    半毗连队列的作用就是,区分来客户端的哀求是第一次握手照旧第三次握手
    全毗连队列的作用是,让accept()函数今后中取走已完成毗连的socket
   

   
    accept()接受一个来自客户端的毗连哀求
    底层就是去全毗连队列里取socket
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    参数:
    sockfd:监听套接字描述符
    addr:指向 struct sockaddr 范例的指针,接收客户端的地点信息
    addrlen:地点长度指针,接收客户端地点长度
    返回值:成功返回新的套接字描述符,失败返回 -1
   
   
    connect()主动发起与服务器的毗连
    底层就是去,动态选择一个本地可用端口,作为发起毗连的源端口
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    参数:
    sockfd:套接字描述符
    addr:指向 struct sockaddr 范例的指针,包含服务器的地点信息
    addrlen:地点长度,通常为 sizeof(struct sockaddr_in)
    返回值:成功返回 0,失败返回 -1
   

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表