TCP协议 #
TCP面向字节流,将应用层传下来的数据看成一串字节流,但是在发送时是从缓存中去一部分(字节单位)加上首部构成TCP报文发送出去的

报文格式 #
首部格式:

源端口号和目的端口号标识各自的应用进程
-
序号:增加到最后一个时下一个又从0开始,它指出的是本报文段中数据的第一个字节的序号(而不是报文的序号)
-
确认号:表示序号n之前的数据都已正确接收,期望接收序号为n的数据(ACK字段取为1表示确认号字段有效)
-
数据偏移:表示首部的长度(首部是可扩展的),也告诉了数据部分的起始处
-
窗口:用于流量控制
连接管理 #
三个要求:
- 双方要知道对方的存在
- 双方需要协商某些参数
- 对运输实体资源分配
建立 #
需要三次握手:
-
客户机向服务器发送请求报文段
SYN=1表示是一个连接请求,不携带数据但仍然消耗一个数据号
-
服务器收到,同意,发回确认(同时分配缓存和变量)
SYN=1表示这是一个同意,ACK=1表示确认字段有效,ack=x+1表示正常
-
客户机收到后,再向服务器发出确认(并分配缓存) ,服务器收到后就进入已连接状态,不再确认了
ACK=1表示有效,ack=y+1表示正常,seq=x+1,但此时如果不携带数据就不消耗
注意,确认号和确认位不一样,确认位只有0和1,表示确认号是否有效的;这里面SYN位表示是前两次握手需要对方确认,ACK表示在确认
第三次握手的必要性:防止已经失效的连接请求报文段突然到达服务器,如果仅第二次握手服务器就进入ESTABLISHED
状态的话就会一直空等数据
释放 #
四次挥手,双方都能主动释放,但我们还是以客户主动释放来学
- 客户发送关闭请求后,关闭这方的数据发送
- 服务器收到后关闭数据接收,并发送确认(此时服务器仍然能向客户发送数据)
- 等到服务器觉得没有数据要发送了,再次发送确认,表示今后不会再发数据过来了
- 客户端收到后再确认,服务器收到后完全关闭 ,而客户端是定时后才完全关闭

更高级的,如果客户端发生故障,服务器也有保活计时器确保不会一直等下去