TCP/IP 不是一个单独的协议
TCP/IP 并不是单独的一个协议,而是一个协议族(TCP/IP 协议族),这个协议中最核心的两个协议是 TCP(传输控制协议)和 IP(网际协议)。
TCP 特点
TCP 协议是面向连接的通讯协议面向连接的会话的建立过程如下:1.源应用程序请求一个面向连接的通信会话。2.建立会话(需要一段时间,是选用无连接的协议的一个原因)。3.在逻辑连接上开始数据传输。4.传输结束时,信道解除连接。
简单的说面向连接的会话,就像打电话一样 1.我想要跟我妈打个电话。2.我打过去了,我妈的手机开始响,截止到我妈接电话这个动作。3.我跟我妈说:‘妈,我没钱了’。4.我妈挂断电话。
其实在数据传输(我跟我妈说“我没钱了”)之前和之后有很多动作,包括“想打电话,打电话,接电话,挂电话”。而建立 TCP 连接之前需要进行三次握手,而断开连接则需要四次挥手。这么麻烦,每次数据通讯的时候需要耗费的资源更多,这样做的好处就是比较可靠,哪怕你传输失败了,你也能知道 – 哦,我这次通讯失败了(跟 UDP 一个比较大的区别)。
tcp 报头
源端口和目标端口分别是本机的端口和请求服务器的端口,每个只能 16 位,所以你知道为啥端口只能 65535 个了吗,别找 ip 了,在 ip 报头里那序号:客户端随机产生的一个值,长度为 32 位确认号:是接受信息端,接受数据包之后,返回的时候把(序号 +1)返回,这样发送端就知道:这个返回的确认号 = 我刚才发送的序号 +1,所以这个数据是回复我的数据偏移:tcp 报首占了数据的 X 位,所以从开始往后数 X 位才是你的你需要的数据,此处的 X 就是数据偏移保留: 保留为今后使用,但目前应置为 0 标志位: 一共有 6 个,分别占 1 位,共 6 位
1. 紧急 URG: 它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送
2. 确认 ACK: 当 ACK= 1 的时候,确认号有效, 建立连接之后所有的 ack 都应设置为 1
3. 推送 PSH (Push):当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付。
4. 复位 RST (Reset):当 RST = 1 的时候,表示 TCP 连接中出现严重错误,需要释放并重新建立连接。
5. 同步 SYN (SYNchronization):当 SYN = 1 的时候,表明这是一个请求连接报文段。一般称携带 SYN 标志的 TCP 报文段为「同步报文段」。在 TCP 三次握手中的第一个报文就是同步报文段,在连接建立时用来同步序号。对方若同意建立连接,则应在响应的报文段中使 SYN = 1 和 ACK = 1。
6. 终止 FIN (Finis): 当 FIN = 1 时,表示此报文段的发送方的数据已经发送完毕,并要求释放 TCP 连接。一般称携带 FIN 的报文段为「结束报文段」。在 TCP 四次挥手释放连接的时候,就会用到该标志
窗口大小 Window Size: 该字段明确指出了现在允许对方发送的数据量. 校验和 TCP Checksum: 由发送端填充,接收端对 TCP 报文段执行 CRC 算法,以检验 TCP 报文段在传输过程中是否损坏,如果损坏这丢弃。紧急指针 Urgent Pointer: 仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数。当 URG = 1 时,发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。
tcp 连接端口状态
LISTENING 状态:侦听(LISTENING)状态 ESTABLISHED 状态:建立连接。表示两台机器正在通信 CLOSE_WAIT: 对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成 CLOSE_WAIT 此时我方要调用 close()来使得连接正确关闭 TIME_WAIT: 我方主动调用 close()断开连接,收到对方确认后状态变为 TIME_WAIT。处于 TIME_WAIT 状态的连接占用的资源不会被内核释放 CLOSED:初始状态,表示没有任何连接 TIME_WAIT: 表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后即可回到 CLOSED 可用状态了 CLOSING:当两端都主动发送 FIN 的时候,并且在收到对方对自己发送的 FIN 之前收到了对方发送的 FIN 的时候,两边就都进入了 CLOSING 状态,只要收到了对方对自己的 FIN 的 ACK,就可以双双进入 TIME_WAIT 状态
三次握手四次挥手
1. 第一次握手:建立连接。客户端发送连接请求报文段,发送的 SYN 位置为 1,序号(Sequence Number)为 x; 然后,客户端进入 SYN_SEND 状态,等待服务器的确认;2. 第二次握手:服务器收到 SYN 报文段。服务器收到客户端的 SYN 报文段,需要对这个 SYN 报文段进行确认,设置确认号(Acknowledgment Number)为 x +1(Sequence Number+1); 同时,自己自己还要发送 SYN 请求信息,将 SYN 位置为 1,序号(Sequence Number)为 y; 服务器端将上述所有信息放到一个报文段 (即 SYN+ACK 报文段) 中,一并发送给客户端,此时服务器进入 SYN_RECV 状态;3. 第三次握手:客户端收到服务器的 SYN+ACK 报文段。然后将确认序号(Acknowledgment Number)设置为 y +1,向服务器发送 ACK 报文段,这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手。完成了三次握手,客户端和服务器端就可以开始传送数据
1. 第一次挥手:主机 1(可以使客户端,也可以是服务器端),设置 Sequence Number 和 Acknowledgment Number,向主机 2 发送一个 FIN 报文段; 此时,主机 1 进入 FIN_WAIT_1 状态; 这表示主机 1 没有数据要发送给主机 2 了;2. 第二次分手:主机 2 收到了主机 1 发送的 FIN 报文段,向主机 1 回一个 ACK 报文段,Acknowledgment Number 为 Sequence Number 加 1;主机 1 进入 FIN_WAIT_2 状态;主机 2 告诉主机 1,我“同意”你的关闭请求 3. 第三次挥手:主机 2 向主机 1 发送 FIN 报文段,请求关闭连接,同时主机 2 进入 CLOSE_WAIT 状态;4. 第四次挥手:主机 1 收到主机 2 发送的 FIN 报文段,向主机 2 发送 ACK 报文段,然后主机 1 进入 TIME_WAIT 状态; 主机 2 收到主机 1 的 ACK 报文段以后,就关闭连接; 此时,主机 1 等待 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,主机 1 也可以关闭连接了。至此,TCP 的四次挥手就这么愉快的完成了
图片描述这个是两个通讯方同时发起结束的情况 1. 主机 A,设置 Sequence Number 和 Acknowledgment Number,向主机 B 发送一个 FIN 报文段; 此时,主机 A 进入 FIN_WAIT_1 状态; 这表示主机 A 没有数据要发送给主机 B 了, 于此同时第二部正在进行,接收到主机 B 发过来的申请断开连接的请求,进入 CLOSING;2. 主机 B,设置 Sequence Number 和 Acknowledgment Number,向主机 A 发送一个 FIN 报文段; 此时,主机 B 进入 FIN_WAIT_1 状态; 这表示主机 B 没有数据要发送给主机 A 了, 之后接收到主机 A 发过来的申请断开连接的请求,主机 B 也进入 CLOSING3 主机 A 同意主机 B 提出的断开申请的要求,同时接受到主机 B 同意断开申请的要求,主机 A 状态变为 TIME_WAIT4– 跟第三步一样
widnows 下抓包工具抓到的数据包和 tpc 报头的对应