类型 | 形参 | 协议 | 流程 | 优劣 |
---|---|---|---|---|
Stream Socket | SOCK_STREAM | TCP | 客户端:create - connect - read/write 服务器:create - bind - listen - accept - read/write | 能够分割、排序、重组,传输中断对其影响不大。 |
Data Socket | SCOK_DGRAM | UDP | 客户端:create - sendto 服务器:create - recvfrom | 不用连接,有需要就发送数据。 |
TCP协议下客户端和服务器连接的过程称为“三次握手”。
第一次握手:建立连接时,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
- 未连接队列:三次握手中,服务器维护一个未连接队列,为每个客户端SYN包开设一个条目,表明服务器已收到SYN包,并向客户端发出确认,正在等待确认包。这些条目所标志的连接在服务器处于SYN_RECV状态,当服务器收到客户端的确认包时,删除该条目,服务器进入ESTABLISHED状态。
- Backlog参数:表示未连接队列的最大容纳数目。
- SYN-ACK 重传次数:服务器发送完SYN-ACK包,如果未收到客户端确认包,服务器进行首次重传,等待一段时间仍未收到客户端确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。ps:每次重传等待的时间不一定相同。
- 半连接存活时间:指半连接队列的条目存活的最长时间,也就是服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间的总和。也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
TCP协议通信流程图:
客户端与服务器的三次握手: