TCP属于网络协议中的传输层
TCP头格式![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b8596e9bc5098f65075695e5461793e5.png)
1.包的序列号 :为了解决发送中乱序问题。每个包谁先发谁后发。
2.确认序列号:再次确认包发送的顺序
3.RST:重新连接
4.SYN:发送请求
5.FIN:结束
6.ACK:回复
三次握手
例子:
男生 :我喜欢你,和我交往吧
女生 :好的,我知道了(对男生的答复)。我们交往吧(女生自己发送的一个请求)
男生:好的。(对女生“我们交往吧”一个回复)
男生和女生两者都是一个发送请求一个回应。
为什么不能两次握手或者4次握手?
A发送请求给B。B答复。 此时A可能还没等到B答复就已经挂了。也或者B发送的这个包在半路丢了。还有一种情况是,如果A发送的包没有接收到B回复,则A会一直发送包。在A发送包给B,B有一个请求回复给A了,但是A这个时候已经挂了。但是A之前发送的包绕了一个大圈回到了B,B以为这是A刚刚发送的请求包,于是B在回复给A。但是这个链接是不能通的,A已经挂了此时。
这样三次握手双方都有一发一回。如果四次的话也可以。四十次也可以,这样下去就没完没了。所以只要双放有去有回就可以啦
首先 A和B处于close的状态,此时B处于一个监听某个端口的状态。当A发送一个SYN给B后,A便处于SYN—SENT的状态,此时B接受到消息后,发送一个SYN和ACK给A。此时B处于一个SYN-RCVD状态。 当A接受到B发送的SYN和ACK后,回复给B一个ACK 。此时A处于ESTABLISHED状态。B接受到消息后也处于ESTABLISHED状态
四次挥手
例子:
男生:我们分手吧
女生:好的我知道,等我收拾好行李发消息给你
** 女生在收拾行李(一个小时后)**
女生:收拾好了,我们分手吧
男生:好的(此时双发约定2个月的过渡期,才可以找新欢)
A和B处于连接状态(ESTABLISHED),首先A发送一个FIN(分手吧)给B,此时A处于FIN_WAIT1状态,B接受到A发送的FIN后,回复A一个ACK(好的我知道,等我收拾好行李发消息给你)后,B便处于close-WAIT状态。A接受到B发送的ACK后,A处于一个FIN_WAIT2状态。B再次发送一个ACK(我收拾好了)和FIN(分手吧)给A后,B处于last_wait状态。A发送一个ACK(好的)。此时A其实可以走了找别的新欢。但是万一这个最后一个ACK B没有收到呢?因此便规定了 A需要等一段时间time_wait 的状态。这个等多长时间呢,长到 等到发送(收拾好了,我们分手吧)还没有收到A的回复。B就会重新发送。然后A回复给B(好的)。这个时间足够A的(好的)信息到达B。TCP规定需要等2MSL。MSL 是 Maximum Segment Lifetime,报文最大生存时间
如果A发送最后一个ACK给B后,直接跑路还有一个问题:A这个端口就空了。这个端口被别的应用给用了。B发送给A的包还有的在路上。当这个新应用接受到路上的这个包。虽然包的序号是重新生成的,可以辨别出来不是新应用需要的。但是为保险一点。所以需要等2msl。这个时间足以让那些路上的包死翘翘。