三次握手内部实现原理


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

相关推荐
@土豆43 分钟前
bond主备模式配置步骤
网络
国冶机电安装1 小时前
其他弱电系统安装:从方案设计到落地施工的完整指南
大数据·运维·网络
m0_738120721 小时前
我的创作纪念日0328
java·网络·windows·python·web安全·php
安科士andxe2 小时前
实操指南|安科士EPON OLT光模块选型、部署与运维全流程解析
运维·服务器·网络
老前端的功夫2 小时前
【Java从入门到入土】21:List三剑客:ArrayList、LinkedList、Vector的爱恨情仇
java·javascript·网络·python·list
百度智能云技术站2 小时前
ClawHub 漏洞警示:官方商店失守,百度智能云守护小龙虾 Skill 供应链安全
网络·安全·web安全
薛定猫AI3 小时前
【深度解析】从 Claude Mythos 到自进化 Agent:下一代 AI 智能体技术栈与落地实践
网络·人工智能
okra-3 小时前
什么是接口?
服务器·前端·网络
DX_水位流量监测4 小时前
德希科技在线色度传感器
大数据·网络·人工智能·水质监测·水质传感器·水质厂家·农村供水水质监测方案
Blurpath住宅代理4 小时前
原生住宅IP深度解析:技术本质、优势边界与使用规范
网络·静态ip·动态ip·代理·代理ip·住宅ip·住宅代理