状态机
+---------+ ---------\ active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | | CLOSE \ \
------------ | | ---------- \ \
create TCB | | delete TCB \ \
V | \ \
+---------+ CLOSE | \
| LISTEN | ---------- | |
+---------+ delete TCB | |
rcv SYN | | SEND | |
----------- | | ------- | V
+---------+ snd SYN,ACK / \ snd SYN +---------+
| |<----------------- ------------------>| |
| SYN | rcv SYN | SYN |
| RCVD |<-----------------------------------------------| SENT |
| | snd ACK | |
| |------------------ -------------------| |
+---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+
| -------------- | | -----------
| x | | snd ACK
| V V
| CLOSE +---------+
| ------- | ESTAB |
| snd FIN +---------+
| CLOSE | | rcv FIN
V ------- | | -------
+---------+ snd FIN / \ snd ACK +---------+
| FIN |<----------------- ------------------>| CLOSE |
| WAIT-1 |------------------ | WAIT |
+---------+ rcv FIN \ +---------+
| rcv ACK of FIN ------- | CLOSE |
| -------------- snd ACK | ------- |
V x V snd FIN V
+---------+ +---------+ +---------+
|FINWAIT-2| | CLOSING | | LAST-ACK|
+---------+ +---------+ +---------+
| rcv ACK of FIN | rcv ACK of FIN |
| rcv FIN -------------- | Timeout=2MSL -------------- |
| ------- x V ------------ x V
\ snd ACK +---------+delete TCB +---------+
------------------------>|TIME WAIT|------------------>| CLOSED |
+---------+ +---------+
拥塞控制
1 慢开始和拥塞避免 2 快速重传
慢开始
慢开始为了什么?
快速重传
快速恢复
我的理解
tcp本质是什么?
本质是一个字节流
为什么会有大小端问题?
因为字节流终究是字节流,如果你只要一个字节的的话在不同端的机器一点问题都没有
怎么保证不丢包?
序号+重传,为什么序号可以?
因为序号是和包一一映射的,所以序号和报文是同构的,也就是一一映射的
重传有什么问题吗?
因为序号和包一一对应,也就是幂等的,所以重传没有什么问题
为什么需要状态机? 因为状态机是从一个状态到另外一个状态,这样我们更加明确整个流程
相关阅读
- https://www.cs.princeton.edu/courses/archive/fall06/cos561/papers/cerf74.pdf
- https://tools.ietf.org/html/rfc793
- https://ee.lbl.gov/papers/congavoid.pdf
- https://www.cnblogs.com/diegodu/p/4538897.html
- https://tools.ietf.org/html/rfc3782
- https://tools.ietf.org/html/rfc2581
- http://www.eecs.umich.edu/courses/eecs489/w07/LectureSlides/lec8_tcp.pdf