对TCP三次握手的理解

最近确实有点刷博客,但我其实不是刻意刷的。因为准备实习,复习知识时难免会有一些自己的想法,总结一下,用自己的语言描述过程,也是为了加深理解,免得死记硬背。


其实我觉得,要是面试问3次握手,背下一个表格就可以了:



syn ack seq
客户端 true
x
服务器 true x+1 y
客户端
y+1 z


但我觉得,既然学到了,就有必要细致的学习下去,不能急功近利的去死记硬背,毕竟对我而言,还有一年的时间才会毕业,毕竟才3月份刚结束。

当然,这3次握手毕竟显得有点抽象,不便于理解是两只什么样的“手”。这里给一个wireshark拦截的数据片段。

这样就把抽象的过程具体化了,但是光这3串字符串并不能说明什么,有必要用自己的话对过程进行个简单的描述:

在一个syn报头里,有这些数据:

Seq:顺序号码,其实这个数字是随机产生的,它是为了连接以后传送数据用,第三次握手是在第一次握手的值上+1。他和ack相对应,ack是等待接收的数据包的序列号。这个就和前面的表对应上了

Win:windowssize:确实是窗口大小的意思,但它的作用是TCP流量的控制。比如这里的win=8192表示一次可以发8192个数据包。这个值是可变的,因为是16位,所以范围最大是65535

Len:它确实是长度的意思,但表示的是段长,就是Segment,和下面的MSS是对应的,我的理解是,TCP可以把上一层的请求分成更小的段,但握手时不需要数据,不知道理解的对不对

MSS:maximum segment size 是最大报文传输段,不包括TCP首字段,它表示期望收到的MSS的值,默认值是536,单位是字节,即主机能够接受20+536字节的TCP报文段。

SACK-PERM:选择确认,是用来重传缺少的报文段。它的选项字段最大是40字节,其中两个是功能字节。比如缺失了字节块,就会用剩余的38个字节记录位置。由于缺失序号由起点和终点组成,且每个序号是32位,因此记录一个快需要64位,就是8个字节。因此它只能指明4个字节块。

这就是我的理解,参考了很多东西换成自己的语言就是这样,有的可能不是很准确。

当然,关于SYN攻击我也说一点理解吧:因为第二次握手是半连接,会有超时的可能,所以服务器会有一条任务序列。通过伪造IP,发送大量这样的请求,服务器就会在得不到第三次握手时不断伸出“手”来尝试,这样就越来越慢了。因为linux的netstat(这个语句也是面试必考吧?)可以查看链接状况,所以可以关掉SYN_RECV状态下的链接。


对于Socket的理解

我们都知道,在java里用Socket实现三次握手就是connect()方法解决的。我过去也一直想弄明白Socket和网络七个层之间的关系。这里先列出我以前笔记里的一个表格



应用层(程序) HTTP、FTP等
表示层(协议,编码,压缩)
会话层(同步,安全性)
传输层(顺序,出包)  TCP负责传输 TCP
网络层 (目的地<物理地址>出小包)    IP规定一个地址 目的地 IP
数据链路层 (01封帧)
物理层  (传比特流01)


Socket实际上是一个接口,它不属于OSI,但它用到了TCP层以上的功能实现通信,它需要使用TCP的端口号

而HTTP这些协议用到了TCP的端口,比如HTTP就是80端口


四次挥手我也用表格表示


fin ack seq
主动方 TRUE z x
被动方
x+1 z
被动方 TRUE x y
主动方
y x

fin表示结束会话


















你可能感兴趣的:(对TCP三次握手的理解)