本文目录
1.TCP简介
2.TCP连接过程和状态
3.TCP服务端编程模型
1.TCP简介
TCP是TCP/IP协议栈中的传输层协议,基于字节流,面向连接,全双工可靠全输。其合并了OSI七层模型为TCP/IP网络四层模型。至顶向下为应用层,传输层,网络层,链路层(网络接口层)。
1.1 TCP报文格式
1、源端口和目的端口(各16位),结合IP首部中的源地址和目的地址标识出网络中唯一进程 。
2、序列号(32位),表示该报文段中第一个数据字节的序号。
3、确认号(32位),期望下一个接收到的TCP分段号仅当ACK为1时有效。
4、首部偏移长度(4位),需要这个位置是为任选字段的长度是可变的。
5、保留位(6位),必须为0
6、标志位(6位),URG,ACK,PSH,RST,SYN,FIN,可置多个为我,如SYN=1 && ACK=1.
7、窗口(16),TCP的流量控制是通过的连接每一端通过声明的窗口大小来提供。窗口大小为字节数,超始于确认序列号字段指明的值 ,这个值是接收端正期望的值。
8、检验和(16位),用于对分段首部和数据进行检验。
9、紧急指针(16),仅当URG=1时紧急指针才有效。其值是一个正的偏移量和序列号字段的值相加表示紧急数据最后一个字节的序号。
2.TCP连接过程和状态
TCP协议操作可以分为三个阶段。在进入数据传输阶段之前,必须在多步骤握手过程(连接建立)中正确地建立连接。数据传输完成后,连接终止关闭已建立的虚拟电路并释放所有已分配的资源。
2.1 三次握手
1、客户端(ALICE)向服务端(BOB)发送SYN=1 & SEQUENCE=X,客户端进入SYN_SENT。
2、服务端(BOB)收到客户端(ALICE)发来的请求回应ACK=1 & SYN=1 & SEQUENCE=y & acknowledgement-number=x+1,服务端进入 SYN_RECEIVED。
3、客户端ALICE 回复ACK(acknowledgement-number=y+1) 进入ESTABLISHED。
2.2 状态变化
TCP连接由操作系统通过一个表示本地通信端点Internet套接字的编程接口来管理。在TCP连接的生命周期中,本地端点会经历一系列状态变化:
CLOSED:初示状态
LISTEN:表示服务端某个SOCKET处于监听状态,可以接受远程主机连接。
SYN_SENT:表示客户端已发送SYN报文。客户端执行CONNECT时,发送SYN报文,随即进入SENT_SENT状态,等待服务端的3次握手中的第2个报文。该状态与SYN_RECEIVED相对应。
SYN-RECEIVED:表示服务端收到了SYN报文。
ESTABLISHED:表示3次握手完成,连接建立。
FIN_WAIT_1: 主动关闭连接一则发送FIN报文进入FIN_WAIT_1。当对方回ACK后进入FIN_WAIT_2.正在实际环境中,无论对方在什么情况下,都应尽可能回应ACK,所以FIN_WAIT_1状态一般较为难看见,FIN_WAIT_2有时可以用NETSTAT看到。
FIN_WAIT_2:FIN_WAIT_2状态下的SOCKET表示半连接即一方要求CLOSE但另一方可能还有点数据要传送,稍后再关闭连接。
TIME_WAIT:表示收到了对方的FIN报文并发送出了ACK报文,等待2MSL(2个报文最大存活时间)进入CLOSED
CLOSING:(服务器和客户端)表示等待远程TCP的连接终止请求确认。
CLOSE_WAIT:等待被动关闭方关闭连接。当收到对方FIN报文回应ACK后进入此状态 。接下来要考虑的你是否还有数据需要发送给对方,或没有则发送FIN报文关闭这个SOCKET。
LAST_ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文,当收到ACK后进入CLOSED。
2.3 关闭连接4次挥手
1、主动关闭侧调用CLOSE给被动关闭侧发送FIN报文,主动关闭侧进入FIN_WAIT_1。
2、被动关闭侧收到FIN报文后关闭该SOCKET的读同时回应ACK,被动关闭侧进入CLOSE_WAIT。
3、主动关闭侧收到ACK后同时关闭该SOCKET的写,进入FIN_WAIT_2。
4、被动关闭侧调用CLOSE给主动关闭侧发送FIN,进入LAST_ACK。
5、主动侧收到被动侧的FIN报文后进入回应ACK进入TIME_WAIT,2MSL后SOCKET关闭。
3.TCP服务端编程模型
1、经典模型
2、REACTOR模式单线程版
3、RACTOR模式多线程版
3.1 单REACTOR
3.2 多REACTOR
参考资料
1.TCP
2.Scalable IO in Java