TCP协议:
-
TCP头部格式
1 ) 16位端口号:
告知主机该报文段是来自哪里以及传给哪个上层协议或者应用程序的。在TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。知名服务端口号定义在/etc/services中。2 ) 32位序号:
一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号。
假设主机A和主机B进行TCP通信,A发给B的第一个TCP报文段中,序号值被初始化为某个随机值ISN,那么在这个传输方向上,后续的TCP报文段中的序号值被系统设置为ISN+该报文段所携带数据的第一个字节在整个字节流中的偏移。
例子:某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。3 ) 32位确认号:
用作对另一方发送的TCP报文段的相应。其值是收到的TCP报文段的序号值加1。4 ) 4位头部长度:
标识TCP头部有多少个4Byte。4位能表示0~15,所以TCP头部最长为60Byte。5 ) 6位标志位
URG:表示紧急指针是否有效。
ACK:表示确认号是否有效。一般携带ACK标志的TCP报文段为确认报文段。
PSH:提示接收端应该立即从TCP接受缓冲区中读走数据,为接受后续数据腾出空间。
RST:表示要求对方重新建立连接。一般称携带RST标志的TCP报文段为复位报文段。
SYN: 表示请求建立一个连接。一般称携带SYN标志的TCP报文段为同步报文段。
FIN: 表示通知对方要关闭连接了。一般称携带FIN标志的TCP报文段为结束报文段。6 ) 16位窗口大小:TCP流量控制的一个手段。指的是接受通告窗口,告诉对方本端TCP接受缓冲区还能容纳多少字节的数据,这样对方可以控制发送数据的速度。
7 ) 16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法,验证是否损坏。
8 ) 16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。确切的说,这个字段是紧急指针相对当前序号的偏移。
总结:
1 ) TCP的包没有IP地址,但是有源端口和目的端口。
2 ) 一个TCP需要4个元组(src_ip、src_port、dst_ip、dst_port)来表示是同一个连接。(还有一个是协议)
3 ) sequence number是包的序号,用来解决网络包乱序问题。
4 ) acknowledgement number是ack,用于确认收到。
5 ) window也就是滑动窗口,用于解决流控问题。
6 ) TCP Flag,包的类型,用于操控TCP的状态。 -
TCP的3次握手与4次挥手
TCP所谓的连接,是在通信双方维护一个连接状态。
1 ) 建立连接(3次握手)
第一次握手:建立连接时,客户端发送SYN=J到服务器,进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到SYN=J的包,确认客户的SYN=J(ACK=J+1),同时自己也发送一个SYN=K包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到SYN=