网络socket的描述和相关结构定义

一.网络是一个状态机,如下:

网络状态机

 

状态:

CLOSED      没有活动的连接

LISTEN        服务器正等待请求

SYN RCVD    一个连接请求 到达, 等待 ACK

SYN SENT      应用程序已经开始打开连接

ESTABLISHED  已连接

FIN WAIT1      应用程序说它已经结束连接了

FIN WAIT2      另一方已经同意释放连接

TIMED WAIT    等待所有分组膀逐渐消失

CLOSING      双方试图同时关闭连接

CLOSE WAIT    另一方已经发起了释放连接的过程

LAST ACK     等待所有的分组 逐渐消失

 

 

二.关于三次握手的过程(摘自baidu)

 

TCP/IP 协议中, TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。

  第一次握手:建立连接时,客户端发送syn (syn=j) 到服务器,并进入 SYN_SEND 状态,等待服务器确认;

  第二次握手:服务器收到syn 包,必须确认客户的 SYN ack=j+1 ),同时自己也发送一个 SYN 包( syn=k ),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;

  第三次握手:客户端收到服务器的SYN ACK 包,向服务器发送确认包 ACK(ack=k+1) ,此包发送完毕,客户端 三次握手协议和服务器进入 ESTABLISHED 状态,完成三次握手。

  完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:

  未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN 包( syn=j )开设一个条目,该条目表明服务器已收到 SYN 包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV 状态,当服务器收到客户的确认包时,删除该条目,服务器进入 ESTABLISHED 状态。

  SYN-ACK  重传次数:服务器发送完 SYN ACK 包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。 

  半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN 包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为 Timeout 时间、 SYN_RECV 存活时间。

 

三次握手

ACK  Acknowledgement number

PSH   带有 PUSH 标志的数据

RST   重置一个已经混乱的连接

SYN   建立连接的过程

FIN   释放一个连接

VRG  Urgent pointer紧急指针

 

三. socket相关数据结构

 


 

/*用于 bind,connect,recvfrom,sendto */

struct  sockaddr {

         unsigned short  sa_family;

         char  sa_data[14];  };

 

struct  sockaddr_in{

         short int sin_family;

         unsigned short int  sin_port;

         struct in_addr  sin_addr;                       

         unsigned char  sin_zero[8];  };


 

typedef struct in_addr {

      union {

            struct { unsigned char s_b1, s_b2, s_b3, s_b4; } S_un_b;

            struct { unsigned short s_w1, s_w2; } S_un_w;

            unsigned long  s_addr;  /* =inet_addr("192.168.0.1"); */

           } S_un;

}  IN_ADDR;


 

typedef struct _INTERFACE_INFO {

  u_long       iiFlags;

  sockaddr_gen  iiAddress;

  sockaddr_gen  iiBroadcastAddress;

  sockaddr_gen  iiNetmask;

} INTERFACE_INFO, FAR * LPINTERFACE_INFO;


 

typedef union {

  struct sockaddr  Address;

  struct sockaddr_in  AddressIn;

  struct sockaddr_in6_old  AddressIn6;

} sockaddr_gen;


 

 

struct hostent {

  char FAR*  h_name;

  char FAR FAR** h_aliases;

  short  h_addrtype;

  short  h_length;

  char FAR FAR** h_addr_list;  };


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值