浏览时候:8min
浏览目标:
- 控制TCP衔接历程
- 学会盘算seq、ack码
TCP 协定是HTTP协定的主要基础,充足明白TCP协定的衔接及端口,有助于我们深切明白收集请乞降衔接。本日就来看图进修TCP要求的衔接、数据传输及端口衔接。
OSI
7层收集模子
OSI是
Open System Interconnection
的缩写,国际规范化构造(ISO)制订了OSI模子,该模子定义了差别盘算机互联的规范,是设想和形貌盘算机收集通讯的基础框架。
参考模子(从上至下) | 各层寄义 |
---|---|
应用层 | 为应用程序供应效劳,如HTTP、FTP、SMTP、POP3等 |
示意层 | 数据格式转换翻译、数据加密解密、紧缩解紧缩 |
会话层 | 差别机器之间的用户竖立及治理会话 |
传输层 | 竖立治理和保护端到端的衔接,TCP、UDP |
收集层 | IP地点及路由挑选 |
数据链路层 | 物理寻址,将原始比特流转化为逻辑传输线路 |
物理层 | 机器、电子、定时接口通讯信道上上的原始比特流传输 |
1. 传输层
接收上一次的数据,将数据举行支解,保证数据正确抵达对端。
2. TCP
TCP是面向衔接的无状况的协定。为了衔接的可靠性,每次衔接的竖立都须要3次握手。
2.1 竖立衔接(3次握手)
3次握手的目标:
- 同步衔接两边的序列号和确认号;
- 交流TCP窗口大小信息。
客户端(状况) | 竖立衔接(三次握手) | 效劳端(状况) |
---|---|---|
CLOSED | LISTEN | |
SYN seq=0 ==》 | ||
SYN_SENT | ||
《== SYN ACK ack=1,seq=0 | ||
SYN_RCVD | ||
ACK ack=1,seq=1 ==》 | ||
ESTABLISHED | ESTABLISHED |
- 第一次握手: 竖立衔接。客户端发送衔接要求,发送SYN报文,随机天生seq,本例默以为0。然后,客户端进入
SYN_SEND
状况,守候效劳器的确认。 - 第二次握手: 效劳器收到客户端的SYN报文段。须要对这个SYN报文段举行确认,发送ACK报文,将ack设置为1(ack值为对方
seq+1
或许seq+L
(数据长度L))。同时,本身还要发送SYN要求信息,将seq为0。效劳器端将上述一切信息一并发送给客户端,此时效劳器进入SYN_RECV
状况。 - 第三次握手: 客户端收到效劳器的ACK和SYN报文后,举行确认,然后将ack设置为1,seq设置为1,向效劳器发送ACK报文段,这个报文段发送终了今后,客户端和效劳器端都进入
ESTABLISHED
状况,完成TCP三次握手。
2.2 数据传输
客户端 | 数据传输 | 效劳端 |
---|---|---|
PSH seq=1, ACK ack=1(segmentLen = 99) ==》 | ||
《== PSH seq=1, ACK ack=100 (segmentLen = 119) | ||
ACK ack=120,seq=100 ==》 |
- 客户端先向效劳器发送数据,该数据报是长度为99的数据。
- 效劳器收到报文后, 也向客户端发送了一个数据举行确认(
ACK
),而且返回客户端要要求的数据,数据的长度为111,将seq设置为1,ack设置为120(1 + 119)。 - 客户端收到效劳器返回的数据后举行确认(ACK),将seq设置为100, ack设置为112(1 + 111)。
2.3 断开链接(4次挥手)
客户端(状况) | 断开衔接 | 效劳端(状况) | |
---|---|---|---|
FIN ACK ack=120,seq=100 ==》 | |||
FIN_WAIT_1 | |||
《== ACK ack=101,seq=120 | |||
FIN_WAIT_2 | CLOSE_WAIT | ||
《== ACK ack=101,seq=120 | |||
LAST_ACK | |||
ACK ack=121,seq=101 ==》 | |||
TIME_WAIT | CLOSE |
- 第一次挥手:客户端向效劳器发送一个FIN报文段,将设置seq为100和ack为120,;此时,客户端进入 FIN_WAIT_1状况,这示意客户端没有数据要发送效劳器了,要求封闭衔接;
- 第二次挥手:效劳器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,ack设置为101,seq设置为120;效劳器进入了CLOSE_WAIT状况,客户端收到效劳器返回的ACK报文后,进入FIN_WAIT_2状况;
- 第三次挥手:效劳器会视察本身是不是另有数据没有发送给客户端,假如有,先把数据发送给客户端,再发送FIN报文;假如没有,那末效劳器直接发送FIN报文给客户端。要求封闭衔接,同时效劳器进入LAST_ACK状况;
- 第四次挥手:客户端收到效劳器发送的FIN报文段,向效劳器发送ACK报文段,将seq设置为101,将ack设置为121,然后客户端进入TIME_WAIT状况;效劳器收到客户端的ACK报文段今后,就封闭衔接;此时,客户端守候2MSL后依旧没有收到复兴,则证实Server端已一般封闭,客户端也能够封闭衔接了。
盘算划定规矩:
seq 为序列号
ack 为应对码
seq = 对方上次的ack;(初次发送时seq为体系随机天生)
ack = 对方的seq+1(无数据传输时) 或许 seq+L(报文数据的长度L)