TCP作为网络模型中正数或者倒数的第4层,其实是一个协议,可以理解为操作系统的一个TCP进程,为数据传输提供稳定可靠的通道。一个TCP报文是由首部(报头)+数据组成,其中报头尤其重要。
TCP首部
图片来源与网络
一个TCP报文段的首部前面20个字节是固定的,而后面有4n个字节是根据需求而增加的选项(n为整数且最大为10),因此TCP报文段的首部最小长度是20个字节,最大长度是60个字节
-
源端口和目的端口:各占2个字节(16bit),区分主机的不同进程
-
序号:占4个字节(32bit),记录数据部分第1个字节的序号是多少
-
确认号:占4个字节(32bit),期望收到对方下一个报文的第1个数据字节的序号。例如:B收到A的报文,序号是100,此时B要向A发送确认号101,意味着A下次要给B发送序号为101的报文
-
4位首部长度:占4bit,也叫数据偏移,表示TCP报头的长度,由于TCP报头前20个字节都是固定的,但是可能会有4*10个字节是不固定的,所以TCP报头最大能到60个字节,这个字段就是用来精确记录TCP报头长度的
-
保留:占6bit,保留为今后使用,但目前因置为0
-
标志位:每一个标志占1bit,一共6bit。
- URG:当这个标志置为1,说明此报文是紧急报文,需尽快传递
- ACK:当这个标志置为1,上面的
确认号
字段才会生效,当3次握手结束时此标志置为1 - PSH:较少使用
- RST:当这个标志置为1,此时TCP连接发生严重错误
- SYN:建立连接的同步序号,SYN=1,ACK=0,发送请求,对方同意后,则响应中SYN=1,ACK=1
- FIN:释放连接,FIN=1,表示此次报文发送方发送的数据已经发送完毕,并要求释放TCP连接
-
窗口:占2个字节(16bit),滑动窗口,流量控制问题
-
检验和:占2个字节(16bit),如果接收的报文检验和有误,则丢弃此报文
-
紧急指针:只有
URG
为1是有效,表示报文中紧急数据的字节数 -
选项:长度可变,为4n个字节(n最大=10)
三次握手:
- 请求方(客户端)发送请求,将SYN置为1,假设seq=100,发送到接收方,一般来讲就是服务端
- 服务端接收请求报文,也将自己的SYN置为1,并且将ack=100+1,seq假设200,回传给请求方也就是客户端
- 客户端收到服务端报文,将ack置为200+1,并且发送给服务端
TCP是注重双向通信,面向连接的,上述第2步骤是将服务端的收发合并为一次进行。第2步发送到客户端是校验客户端的通信正常,第3部发送到服务端是让服务端知道自己的通信正常,所以一共是3次握手
四次挥手
任何一方主动发起都是可行的,假设客户端发起
图片来源网络
- 客户端发送报文,将FIN置为1,seq设置好,发送到服务端(FIN报文)
- 服务端收到该FIN报文,将seq设置好,ack+1发送给客户端(ACK报文)
- 服务端将FIN置为1,将seq设置好,ack+1,发送给客户端(FIN报文)
- 客户端收到FIN报文,将ack置为服务端seq+1,发送给服务端(ACK报文),服务端收到后立刻断开。等个2MSL后没收到回复,客户端也立刻断开,那么此次TCP连接就全部断开了
2MSL是最大报文生存时间,如果网络不可靠,有可能最后一个ACK丢失,所以会在这个时间内重发ACK报文
UPD
UDP是面向无连接,只管扔,收不收做强制,只要扔的多,可以保证收的也不少。
UDP只有两个字段,首部字段+数据字段。首部字段8个字节(64bit)由4个字段组成,每个占2个字节(16bit)
- 源端口:需要接收方回应时才用,不需要可置为0
- 目的端口:在终点交付报文时必须使用
- 长度:UDP数据报文的长度,最小时8字节(64bit)
- 检验和:检验报文传输过程中是否有误