一个TCP请求的基本过程是怎样的?
socket
用于指定通信的协议类型,它的返回值为socket descriptor
函数定义为 int socket(int family,int type,int protocol),在 sys/socket.h中定义。
- family:指定协议族,比如 AF_INET表示IPv4协议,AF_INET6表示IPv6协议
- type:表明套接字类型,比如 SCOK_STREAM 表示字节流套接字,SCOK_DGRAM表示数据报套接字
- protocol:表示某个协议类型的常量值,一般为0,表示对所有family和type的用系统默认值。IPROTO_TCP表示TCP协议,IPROTO_UDP表示UDP协议
connect
客户端用来建立与TCP服务器的连接,它的调用将激发TCP的三路握手,即会使当前套接字从CLOSED状态转移到SYN_SENT状态,若成功再转移到ESTABLISHED状态。只有连接建立或者出错才会返回。
connect失败则该套接字不可再用,必须关闭,想要重连接必须再调用socket
connect在那些情况下会出错?
- 客户端没有收到SYN的响应,返回ETIMEDOUT错误。
对于4.4BSD内核发送SYN,没有响应再等6s发送,无响应等24s,如果总共等了75s仍然没有就返回ETIMEDOUT错误
- 客户端收到SYN响应为RST,返回ECONNREFUESED错误。
这是种硬错误。收到RST可能是:没有服务器监听连接的端口;TCP想取消连接;TCP收到一个根本不存在的连接上的分节
- 路由器引发了‘destination unreachable’ ICMP错误。
这是种软错误