UDP协议
UDP的包头格式:
TCP协议
TCP包头格式:
TCP的三次握手TCP的四次挥手 并说明TIME_WAIT的作用?
TCP三次握手和四次挥手是指TCP建立连接和断开连接的过程。
一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。然后客户端主动发起连接 SYN,并指明客户端的初始化序列号 ISN(c),之后处于 SYN-SENT 状态。服务端收到发起的连接,返回 SYN,指明服务端的初始化序列号 ISN(s),并且ACK (客户端的 ISN + 1 )客户端的 SYN,之后处于 SYN-RCVD 状态。客户端收到服务端发送的 SYN 和 ACK 之后,发送 ACK(服务端的 ISN + 1 ),之后处于 ESTABLISHED 状态。服务端收到 ACK之后,处于 ESTABLISHED 状态,自此建立可靠连接。
刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求,第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。第二次挥手:服务端收到 FIN 之后,会发送 ACK(客户端的序列号值 + 1 ) 报文,此时服务端处于CLOSE_WAIT状态。客户端收到ACK就进入FIN_WAIT2状态。
如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。客户端收到 FIN 之后,一样发送一个 ACK (服务端的序列号值 + 1)报文作为应答,此时客户端处于 TIME_WAIT 状态。需要等待的时间设为 2MSL(MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃)以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态。服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
为什么是三次握手而不是两次?
三次握手是为了提供可靠连接,通信双方都要具有发送和接收能力,两次握手,服务端并不能确定自己是否具有发送能力。
TCP协议为保证顺序性为每一个包建立ID,并缓存记录所有发送的包和接受的包;
在 TCP 里,接收端会给发送端报一个窗口的大小,叫 Advertised window。这个窗口的大小应该等于上面的第二部分加上第三部分,就是已经交代了没做完的加上马上要交代的。
Socket
基于TCP协议的Socket程序函数调用过程:
bind()函数绑定IP+端口号
listen()监听
已连接队列:三次握手完成,处于established状态
半连接队列:三次握手未完成,处于syn_rcvd状态
accept()处理已完成的连接
write()
read()
基于UDP协议的Socket程序函数调用过程:
bind()
sendto()
recvfrom()
最大连接数受到文件描述符数目及内存大小限制
- 多进程方式,fork创建子进程
- 多线程方式,pthread_create创建线程
- IO多路复用,Socket调用函数监听fd_set变化
- IO多路复用,epoll通知机制主动通知,在window下叫做IOCP

