一、int socket(int family,int type,int protocol);
1.功能:
该函数用于指明通信协议类型并且创建一个套接字。
2.参数释义:
第一个参数family是指协议族,相当于指定OSI7层模型中的网络层(INv4/IPv6),第二个参数type表示指明套接字类型(字节流套接字/数据包套接字),第三个参数表示的是传输协议(TCP/UDP/SCTp),相当于OSI中的传输层协议。
各个参数的常值说明如下图:
二、inr bind(int sockfd,const structsockaddr*myaddr,socklen_t addrlen);
1.功能:
该函数用于将把本地的协议地址(IP地址、端口号等)赋予一个套接字。
2.参数释义:
第一个参数sockfd表示先前通过ocket()创建的套接字,第二个参数 *mnmyaddr表示一个指针(指向特定协议结构体的地址),第三个参数别偶是结构体的大小。
3.思考为什么要有第三个参数指定协议结构体的大小?
因为不同协议的结构体是不一样的,比如IPv4套接字地址结构,Ipv6套接字地址结构、通用套接字地址结构。我们传递的参数是一个指针(一般强制转化为通用套接字地址结构类型),也就是只知道结构体的首地址,所以我们需要addrlen来获悉套接字的大小。
三、int listen(int sockfd,int backlog)
1.功能:
该函数仅由服务端来调用,主要有两个功能:
(1)socket创建的套接字默认是一个主动套接字(CLOSED状态),也就是说是要调用connect发起连接的套接字,该函数把一个主动套接字转化Wie一个被动套接字(LISTEN状态)。
(2)第二个参数backlog规定了内核应该为相应套接字排队的最大连接个数,未完成连接队列的最大长度。
RTO(Retransmission TimeOut)
为了防止数据报丢失,当TCP发送一个报文时,就启动重传计时器,有2种情况:
1.若在计时器超时之前收到了特定报文的确认,则撤消这个计时器;
2.特定数据报在计时器超时前没有收到确认,则重传该数据报,并把计时器复位
RTT
简单来说,就是我发送一个数据包,然后对端回一个ack,那么当我接到ack之后,就能计算出从我发送出包到接到过了多久,这个时间就是RTT。RTT的计算是很简单的,就是一个时间差。
四、backlog说明
内核任何一个给定的舰艇套接字维护两个队列:
(1)未完成队列连接队列,开始进行三次握手但是未完成三次握手的套接字都处于这个未完成连接的队列当中(SYN_RCVD)。
(2)已完成连接队列:已完成三次握手的套接字都会被从未完成连接队列转移到已完成连接的队列(ESTABLISHED),每次队首元素去进行accept(),该队列为空的时候accpet()阻塞。
关于baklog注意事项:
1.未完成连接队列中的套接字将被一直保持直到完成三次握手或者超时(75s)。
2.当未完成队列满时,又收到客户的SYN,TCP会忽略该分节,就是不发送RST,客户端收不到ACK就会重发,期望此时队列是未满的。
3.backlog有一个模糊因子,就是默认将backlog扩大1.5倍。
4.不要把backlog定义为0,因为不同的实现对此有不同的解释,如果不想连接任何客户端,就关闭该监听套接字。