阅读 259

理解tcp协议

前言

本来想实现一个小功能,然后就去看vlc的代码,然后发现看不懂,就去看GCDAsynSocket的代码,然后就去学网络相关的知识,记录一下tcp协议的理解过过程

这篇讲的太好了

tcp协议格式

要理解tcp协议,我们就要从这个协议的格式来说,也就是说这个协议的可靠性是怎么来的。如下图.

报文

这里只介绍几个,其他的可以自己去了解

SYN标志位

请求建立连接的时候设置。在tcp三次握手的过程中,会设置该标志位

ACK标志位

在确认报文中,会设置该标志位

FIN标志位

在关闭连接的时候,会设置该标志位

序号(seq)

当前报文的序号。

确认号(ack)

是希望获得的下一条报文的序号,这个一定要理解。举个例子:A和B建立连接之后,假如当前A发送一条报文给B,报文如:seq=a,ack=b,表示我当前的报文的序号是a,我希望你给我发的下一条报文的序号是b,那么B针对这条报文的回复报文就是:seq=b,ack=a+1,表示我当前的报文序号是b,我希望你给我发送的下一条报文是a+1.接着A发给B的下一条报文为:seq:a+1,ack=b+1,如下图

tcp报文有序号和确认号,用来保证报文的有序性,不会错乱,校验和用来保证(不完全)报文不会出错,tcp还有超时重传的机制,保证报文不会丢失.有序号可以保证数据不重复。

Wireshark查看tcp报文格式

下面详细的标明了对应字段的含义,和报文格式一模一样。如下图

tcp三次握手

1: client向server发起链接请求。 报文会做如下设置: SYN设置为1,表示这是一条链接请求.seq序号是随便的,这里我设置为K+1。报文如下: SYN(这个是标志位)=1, seq=K.

2: server收到了客户端的连接请求。那么会针对这个请求会回一个确认,并且自己也会发送一个syn请求,seq也是随便的,设置为J。报文如下: SYN(这个是标志位)=1 ACK(这个是标志位,表示这是一确认报文)=1 SEQ=J, ack(这个是确认号)=k+1(对你给我的报文k进行确认),这个地方的ACK和ack不要搞混淆了。

3: client收到server的报文之后,会回一条确认报文.报文为:ACK(标志位)=1, ack=J+1

tcp四次挥手

这里就不介绍4次挥手了,本文重点也不是介绍4次挥手,重点是根据Wireshark来加深对SYN ACK seq ack的理解

使用Wireshark查看tcp报文详细过程

报文1

192.168.0.100  -> 121.40.172.169 
报文标志位为 ACK, SEQ=1095, ACK=26987
Next Sequence Number(NSEQ)=1095,这个其实就是我自己下一条包的SEQ。 

那么这条报文的回复报文应该如下
ACK SEQ=26987,ACK=1095
复制代码

报文2

121.40.172.169    -->   192.168.0.100
SEQ=26987   (就是上一条报文的ACK,我们说了,ACK就是我希望你发的小下一条报文的序号)
ACK=1095    (我希望你发的下一条报文的序号)
NSEQ=28427(28427=26987+1440),这个就是我下一条报文的序号,其实我自己能够知道我下一条报文的序号,也就是为什么接受端有可能先接受的是后面的报文,因为只要我的最开始的序号确定了,所有报文的序号其实已经确认了。

那么这条报文的回复报文应该如下
ACK SEQ=1095 ACK=28427
复制代码

报文3

192.168.0.100  -->  121.40.172.169
SEQ=1095 (当前报文的序号)
ACK=28427 (希望得到的下一条报文的序号)
NSEQ=1095 (自己下一条报文的序号)

那么这条报文的回复报文应该是
SEQ=28427 ACK=1095
复制代码

报文4

121.40.172.169    -->   192.168.0.100
SEQ=28427
ACK=1095
NSEQ=29867
复制代码

到这里这TCP报文传输的过程就分析完毕,整个过程画个图,如下。

TCP滑动窗口的趣味解释

有这样一段老师和学生的对话
情景1:
老师:这周大家在家好好休息,不布置作业.
学生:这周大家..... 写一般忘记了 

情景2:
老师:这
学生:这  
老师:周
学生:周
老师:这么慢我还想早点下班呢

情景3:
老师:这周大家在
学生:这周大家在
老师:家好好休息
学生:家好好.......,老师外面吵我没听清

情景4:
老师:这周大家在
学生:这周大家在
老师:家好好休息
学生:家好好..老师外面吵,这次发两个
老师:家好
学生:家好..老师没那么吵,这次发三个
老师:好好休息
学生:好好休息...不吵了,发10个
老师:,不布置作业
学生:,不布置作业
复制代码

结束语

以上是我个人对TCP协议的理解,如有错误欢迎指正。

文章分类
iOS
文章标签