中年三次握手和四次挥手说完了,还让我手动写个HTTP协议代码


面试官:你了解TCP/IP协议么?
说实话在LZ听到这个问题的时候 , LZ的第一想法就是 , 我回答了这个问题 , 接下来肯定还有一个三次握手和四次挥手等着我 , 但是还是得回答呀 , 于是LZ就开始作答了 。
LZ开始作答:TCP/IP协议虽然会放在一起说 , 但是他们其实呢是属于两个不同的协议 。
IP协议: IP协议实际上是用来查找地址的 , 而它对应的层级也是网络层 , 也可以称之为网际互联层 , 区别不大 , 叫法不同而已 。
TCP协议: TCP协议是用来规范传输规则的 , 和IP协议是不同的 , 而它对应的层级是传输层 , 而这样的话 , 也就是IP去寻找地址 , 吧所有的传输任务都交给TCP , 而TCP这时候就相当于一个快递员的身份出现并且存在 。
面试官:那你说说什么是三次握手 , 什么是四次挥手吧
三次握手
中年三次握手和四次挥手说完了,还让我手动写个HTTP协议代码
本文插图
大家看这个图 , 图是来自于百度搜索 , 而且百度上有各种各样的图 , 当你看到图的时候第一时间肯定是看不懂的 , 也就是只能通过这个画的标志的“线”来进行分析 , 其实这仅仅只是一个方面 。
那么我们就来根据图来解析一下这个图中都代表了什么意思 , 图中存在着两个序号和三个不同的标志位其中有大小写容易混淆的呦 。
序号:
seq:sequence number 的缩写 , 直译的话 , 序号 , 对没错 , 它就是序号 , 你没有翻译错 , 相信自己 , 而这个seq表示的则是自己传递的序号 , TCP在传输的时候 , 其中的每一个字节 , 都会有一个序号 , 发送数据的时候 , 会把第一个数据的第一个序号发送给对方 , 就是我们所看到的第一步 , 而接收的这一方面 , 会按照这个序号来检查是否是一个连接完整的数据 , 如果说你数据是完整的 , 那么好 , 我们可以继续下一步 , 如果你不是完整的 , 那就重新传送呗 , 而这样的话也能保证数据的完整性不被破坏 。
ack:注意 , 这是小写的ack , 也就是acknoledgement number的缩写 , 而他表示的是确认号 , 这个要和ACK(确认位)进行区分 , 接收端这时候用它来给发送端返回成功接收消息的数据信息 , 而这时候 , 它的值就是表明 , 我现在想接收下一个数据包了 , 而这个值就是下一个数据包的开始的序号 , 而这个ack所代表的的值的序号前面的数据都已经接收成功了 。
ACK:确认位 , 确认位来了 , 只有当ACK=1的时候ack才会起到自己应该起的作用 , 而在我们第一次发起请求的时候 , 因为没有需要我们确认的接收的数据 , 所以这个时候的ACK就是0 , 而正常通信的情况下 , ACK就1.
SYN:同步位,而同步位的作用就是用于建立连接时同步序号 , 而刚连接的时候 , 说ACK是0 , 那么ack就不起作用 , 这时候SYN就来说 , 你看没我你们不行了把 , 要你们有何用 , 当接收端接收到SYN=1的报文的时候 , 就会将ack设置为接收到的seq+1的值 , 这也是大家在看百度上提供的内容的时候看到的 , 各种seq=k , ACK=k+1,这玩意就是这么来的 , 这时候ack的值就是根据SYN来直接设置的 , 这样你才能正常的进行传输 , 而SYN有时候会被面试官问到为什么在前两次握手的时候都是1呢?其实这是因为传输数据的双方的ack都是要一个初始值的 , 不然你还怎么传输 , 还怎么玩 。
FIN:终止位 , 这个在本图中 , 并没有完全的体现 , 在四次挥手的时候就能完全的体现出来了 。 而它则是用来在数据传输都完成之后来释放连接的 。
那么关于这个图 , 我们怎么给面试官说呢?
(1) 第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包 , 指明客户端打算连接的服务器的端口 , 以及初始序号 X,保存在包头的序列号(Sequence Number)字段里 。


推荐阅读