一.网络是一个状态机,如下:
状态:
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; };