(1) 地址结构
地址结构有ipv4和ipv6之分;
ipv4通用套接字地址结构
struct sockaddr_in{
//结构长度 uint_8 length; /*我认为不必须指出sockaddr_in的长度,并且事实上很多厂家也没有提供这个字段,而加上这个主要是为了方便处理变长套接口地址结构*/
//协议族 sa_family_t sin_family; /*协议族 AF_INET
//端口地址 in_port_t sin_port; /*16位无符号整形*/
//ip地址 struct in_addr sin_addr;
//保留位 char sin_zero[8];
}
struct in_addr {
in_addr_t s_addr; //32位无符号整数类型
};//ip地址描述结构体
通用套接口地址
struct sockadd {
uint8 length;
sa_family_t sa_family;
char sa_data[14];
}
定义这个结构体的原因:在传递地址参数时,需要通过指针结构来传递,套接口处理函数必须支持所有的协议族套接字地址结构,ansi c 可以通过 void *,或者写一个通用的套接字地址结构。
问题:
1,变长套接口出现在怎样的条件下?
在《unix套接口编程》中有对此作简要的回答:“它是内核处理来自不同协议族的套接口地址结构的历程使用的”.
(2) 套接口编程重要步骤
1, int socket(int domain,int type,int protocol);
2, bind(int sockfd,(struct sockaddr *) sockaddr_in ,socklen_t addr_length) ;
3, connect(int sockfd,const struct sockaddr *serveraddr,socklen_t seraddr_length);
-- listen(int sockfd,int backlog)
-- accept(int sockfd,struct sockaddr * clientaddr,socklen_t clientaddr_length);
4, send(int sockfd,const void *msg,size_t len,int flags)
sendto()
sendmsg()
recv()
recvfrom()
recvmsg()
(3) tcp 三次握手以及为什么要使用三次握手
三次握手的目的是为了同步客户和主机的序列号和确认号,并交换滑动窗口大小信息。第二次握手客户端获取到主机的序列号,但是此时主机不能确认客户端有没有收到,所以需要等待客户端的确认信息。
(4) 断开连接的四次挥手是怎么进行的?
断开连接的一端发送close请求是第一次握手,另外一端接收到断开连接的请求之后需要对close进行确认,发送一个消息,这是第二次握手,发送了确认消息之后还要向对端发送close消息,要关闭对对端的连接,这是第3次握手,而在最初发送断开连接的一端接收到消息之后,进入到一个很重要的状态time_wait状态,这个状态也是面试官经常问道的问题,最后一次握手是最初发送断开连接的一端接收到消息之后。对消息的确认。time_wait之后经过一个2msl等待时间,关闭正式结束。
(5)