ip、tcp报头以及三次握手四次断开-9.20
ip报头分析和TCP报头分析
1、相关基础概念:
- MTU:最大传输单元。通讯协议某一层上所能通过的最大数据包大小,单位为byte。最大长度为1500。
- MSS:最大分片大小,MSS = MTU - IP header头部大小 - TCP 头部大小,其中IP header头部大小和TCP 头部大小通常为20字节。
- TTL:跳数,数据包存活时间,指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。每当数据包经过一个路由器时,其存活次数就会减少1,当其为0时就会被丢弃。
- 关于IPV4的缺点:1.地址太少 2.不算太安全 3.传输质量比IPV6稍弱
2、IP数据报格式:

-
ip数据报是由首部加上数据部分组成的。
-
首部的每一段的整个长度是32个比特(4个字节),其中固定部分共5段,可变部分1段(可选),所以ip数据报首部长度为4*5=20字节。
若添加了可变部分(使整个首部超过20个字节),则要使MSS相对减小,保证MTU总长度为1500。
首部信息:

-
版本(4bit):ip协议版本,是ipv4还是ipv6
-
首部长度(4bit):描述整个首部有多长
-
服务类型(8bit):指的是传输的数据具体的类型,文本、语音、视频等
- 文本的传输效率最高(比较小),视频的传输效率比较低(比较大)
- 为了使某一种类型的数据可以优先传送可以使用ToS优先级技术调整优先级
-
总长度(16bit):整个数据报文(包括数据部分)的总长度
-
标识(16bit):每产生一个数据报,计数器就加1,并将此值赋给标识字段。
-
标志(3bit):用于标志能否进行继续分片,在哪里进行分片的。通常就是当出现可变部分的时候对整个数据报做二次分片。
-
片偏移(13bit):进行二次拆分分片后,某片在原分组中的相对位置。

- 生存时间(TTL)(8bit):数据报在网络中可通过的路由器数的最大值。即计算机发出数据时会附带一个TTL值,该值在数据报每经过一个路由器就自减1,等到某路由器接收到该数据报发现其TTL值变为0时不在中转该数据报,而是将其丢弃并向最初发送者返回一个ICMP报文。TTL的设置可以防止数据报无限循环传输。
- 协议(8bit):此数据报携带的数据使用何种协议,也就是他的上层协议。
- 首部校验和(16bit):只检验数据报的首部不检验数据部分,目的是验证数据报的首部有无错误。类似于FCS。
- 源ip地址(32bit)
- 目的ip地址(32bit)
3、传输层(TCP和UDP)协议和报头:
-
作用:对应用程序产生的数据流进行四层切片,每一个数据切片前面添加传输层报头(包括原应用程序的端口号)
-
端口号范围:0-65535
-
知名应用端口号(不可使用):1-1023
- 20、21:FTP文件传输协议 (提供互联网文件资源共享服务)
- 22:安全的远程登录协议 SSH
- 23:telnet协议 不安全远程登陆协议
- 25:简单邮件传输协议(SMTP)
- 53:域名解析协议 (DNS)
- 80:超文本传输协议 (HTTP)
- 443:安全的超文本传输协议 (HTTPS)
- 110:POP3 邮局协议版本3(接收邮件协议)
- 143:imap 因特网信息访问协议(用来从本地邮件客户端访问远程服务器上的邮件)
- 67:DHCP 动态主机配置协议
-
非知名端口号(随机使用):1024-65535
TCP协议:
可靠连接原理功能:流控功能、防止传输乱序、确定传输是否丢包,重传功能、完整性检查
-
优点:
- 可靠,稳定。TCP的可靠性体现在TCP在传递数据之前,会通过三次握手建立连接,而且在数据传输时,会有确认、窗口、重传、拥塞控制机制。在数据传输完成后,还会断开连接来节约系统资源。
-
缺点:
- 传输效率偏慢,效率一般,消耗带宽高,占用系统资源高。
- 安全性相对较弱,例如DoS攻击、DDoS攻击
- 拒绝三次握手仍要消耗CPU、内存、带宽等资源
- TCP是点到点协议,比较死板,只能单播
TCP报头:
首部的每一段的整个长度是32个比特(4个字节),其中固定部分共5段,可变部分1段(可选),所以TCP报头首部长度为4*5=20字节。

-
源端口(16bit)
-
目的端口(16bit)
-
序号(Sequence Number)(32bit):用来标识从TCP发送端向接入端发送的数据字节流进行编号。
-
确认号(Acknowledgement Number)(32bit):确认号包含发送确认的一端所期望收到的下一个序号。确认号只有在ACK标志为1时才有效。
-
数据偏移(4bit):进行数据段切片时调整数据传输到对应的位置。
-
保留(6bit)
-
标志位:
-
URG(urgent):紧急标志位,为1时表示紧急指针有效,为0则忽略紧急指针。
在丢包或者重传的时候会触发紧急指针。
-
ACK(acknowledgement):确认标志位,多数情况下空,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
- 确认数据传输完成。
-
PSH(push):推送标志位,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
- 留空时推送包,使其为1。
-
RST(reset):重置复位标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
- 在数据传输失败时进行重传或者拒绝请求。
-
SYN(synchronous):同步标志,该标志仅在三次握手建立TCP连接时有效,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
- 在进行TCP三次握手时同步才能进行数据传输。
-
FIN(finish):结束标志,带该标志位的数据包用于结束一个TCP会话。
- 完成数据传输。
-
-
窗口大小(16bit)(Window Size):TCP流量控制由连接的每一端通过声明的窗口大小来提供。
-
检验和(16bit)(Checksum):该字段覆盖整个TCP报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证。
-
紧急指针(16bit)(Urgent Pointer):指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。
UDP协议:
-
优点:
- 效率高、快,比TCP相对安全,无需三次握手和四次断开,被攻击的漏洞少。
-
缺点:
- 不稳定、不可靠,网络质量差的时候容易丢包。
UDP报头:

- 源端口(16bit)
- 目的端口(16bit)
- 长度(16bit):为报头和数据两部分的总字节数。
- 检验和(16bit)(Checksum):UDP检验和作用于UDP报头和UDP数据的所有位。由发送端计算和存储,由接收端校验。
4、TCP/UDP三次握手四次断开
三次握手:
-
第一次握手:客户端向服务器发送同步请求,将SYN同步指针置于“1”,随机选择序列号a,并将该数据包发送给服务器, 此时客户端状态是SYN_SENT状态,服务器的状态为listen监听状态。
-
第二次握手:服务器收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器将标志位SYN和ACK都置为1,ack 序号a+1,随机产生一个序列号seq=b,并将该数据包发送给服务器以确认连接请求,服务器进入SYN_RECEIVED状态。
-
第三次握手:客户端收到确认后,检查ack序号是否为a+1,标志位ACK是否为1,如果正确则将标志位ACK置为1,ack序号=b+1,并将该数据包发送给Server,Server检查ack序号是否为b+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器之间可以开始传输数据了。
四次断开:
-
客户端想跟服务器断开连接,会给服务器发送结束请求你,即FIN结束包,把FIN指针置于”1“,seq=a, ack=b。 意思就是告诉服务器:我没有数据要发送了,可以断开连接了。此时客户端为FIN_wait1状态。
-
服务器收到FIN报文后,发送一个ACK确认报文给客户端,把ACK置于“1” ,seq=b, ack=a+1, 意思是告诉客户端“我已经收到你发的断开请求了。此时服务器为CLOSE_WAIT状态,客户端为FIN_wait2状态。
-
服务器把收尾工作做完后,会给客户端再发送一个FIN包,把FIN指针置于”1“,seq=b, ack=a+1。意思是告诉客户端”我也没有数据要发送了,可以断开。此时客户端是超时等待状态TIME_WAIT, 服务端为LAST_ACK状态。
-
客户端收到服务器发的FIN报文后,再给服务器发送一个ACK确认报文 ,把ACK置于“1” ,seq=a+1, ack=b+1。此时客户端和服务端的状态都为 CLOSE状态。

参考资料:
TCP/IP 数据包报文格式(IP包、TCP报头、UDP报头)(转) - limanjihe - 博客园 (cnblogs.com)

浙公网安备 33010602011771号