TCP三次握手与四次挥手
导致TCP需要四次挥手的原因是半关闭
半关闭 关的是客户端的 写缓冲区,还没有与服务端断开连接
分析图:
三次握手:
文字描述:
三次握手:
注意:
- 采用三次握手而不采用二次握手是为了防止已失效的连接请求报文段突然又传送到了TCP服务器,因而导致错误
- 序号不携带数据,所以不消耗序号
四次挥手:
主动关闭连接请求端,发送FIN标志位。
被动关闭连接请求端,应答ACK标志位。 ——半关闭完成
被动关闭连接请求端,发送FIN标志位。
主动关闭连接请求端,应答ACK标志位。 ——连接全部关闭
注意:
- 序号不携带数据,所以不消耗序号
TCP报文段的首部格式:
- FIN—终止标志位:用来释放TCP连接
- SYN—在TCP连接建立时用来同步序号
- RST—用来复位TCP连接
- 当RST=1时,表明TCP连接出现了异常,必须释放连接,然后在重新建立连接。
- RST置为1还用来拒绝一个非法的报文段或拒绝打开一个TCP连接。
- 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再上交付。
- URG—紧急标志位URG
- 取值为1时紧急指针字段有效;取值为0时紧急指针字段无效。
- 紧急指针占16比特,以字节为单位,用来指明紧急数据的长度。
滑动窗口与TCP数据包格式
* 是一种流量控制技术
* 发送给连接对端
* 滑动窗口的实质是本端缓冲区大小(实时)。
* 滑动窗口的作用是防止数据丢失
mms:Maximum Segment Size(一条数据的最大的数据量)
win:滑动窗口
TCP状态时序图:
文字描述:
* 1.主动发起连接请求端:CLOSE---发送SYN--SEND_SYN--接收ACK、SYN--发送ACK--ESTABLISHED(数据通信态)
*
2.主动关闭连接请求端:ESTABLISHED(数据通信态)--发送FIN--FIN_WAIT_1--接收ACK--FIN_WAIT_2(半关闭)
*
--接收对端发送FIN--FIN_WAIT_2(半关闭)--回发ACK--TIME_WAIT(只有主动关闭连接方,会经历该状态)
*
--等 2MSL时长--CLOSE
*
3.被动接收连接请求端:CLOSE--LISTEN--接收 SYN --LISTEN -- 发送ACK、SYN -- SYN_RCVD--接收ACK -- ESTABLISHED(数据通信态)
*
被动关闭连接请求端:ESTABLISHED(数据通信态)-- 接收FIN -- ESTABLISHED(数据通信态) -- 发送ACK
*
CLOSE_WAIT (说明对端【主动关闭连接端】处于半关闭状态) -- 发送 FIN-- LAST_ACK -- 接收ACK -- CLOSE
重点记忆:ESTABLISHED、FIN_WAIT_2<-->CLOSE_WAIT TIME_WAIT(2MSL)
2MSL时长:
*
一定出现在【主动关闭连接请求端】。---对应TIME——WATI状态。
*
保证,最后一个ACK能成功被对端接收。(等待期间,对端没收到我发的ACK,对端会再次发送FIN请求。)
端口复用:
*
int opt=1; //设置端口复用。
*
setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,(void*)&opt,sizeof(opt));
半关闭:
*
通信双方中,只有一端关闭。 -----FIN_WAIT_2
close(cfd);
shutdown(int fd,int how);
how: