传输层TCP/IP简介

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43058911/article/details/100551564

TCP/IP模型

传输层位于OSI(开放的系统互联参考模型)模型中的第四层,传输层协议为网络中主机之间应用程序通信提供了安全,可靠,有效的报文传送服务,定义了主机应用程序之间端到端的连通性。
传输层在TCP/IP的第三层。
OSI和TCP/IP之间的关系:
在这里插入图片描述
TCP/IP端口划分:
端口不是随便使用的,都是经过国际组织定义,常见的服务端端口都是固定的,要访问服务直接找特定的端口,如果不固定,目标端口都不清楚,报文发出来都不知道往哪里走!
在这里插入图片描述
TCP/IP协议栈中有很多端口,常见端口一定要记得:

snmp		161/tcp
http 		80/tcp 
https 		443/tcp
kerberos 	88/tcp		实现加密的一个协议;
smtp 		25/tcp
pop3 		110/tcp
imap 		143/tcp
smb 		445/tcp
dns			53/tcp

dhcp/s		67/udp
dhcp/c		68/udp
dns			53/udp
qq 			8000/udp

Linux中文件定义了目前为止已经被使用了的端口
		[root@centos7 ~]#cat /etc/services | wc -l
		11176
后面我认识到的会陆续加进来

TCP特性

工作在传输层
面向连接协议
全双工协议
半关闭状态(孤儿连接)
错误检查
将数据打包成段,排序,转发
确认机制
数据恢复,重传
流量控制
拥塞控制

TCP包头结构

在这里插入图片描述

TCP包头结构介绍

源端口 :源设备的应用程序端口号;
目的端口 :目标设备应用程序的端口号;
序号 :在传输层,要将数据切分为多个段,每个段有自己的序号,以便接收方接收到后根据序号组合数据,数据可切割为
	  最大约43亿个段;
确认号 :确认是否接收到数据;
数据偏移 :TCP报文的头部多长,前20位是固定的,但是有可变选项,长度可变;
保留 :空闲的空间;
URG	: 表示本报文段中发送的数据是否包含紧急数据,后面的紧急指针字段(urgent pointer)只有当URG=1是才有效;
ACK	: 表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号才有效。TCP规定,连接建立后,ACK必须为1,
	  带ACK标志的TCP报文段被称为确认报文段;
PSH : 提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间,如果为1,则表示对方应当立
	  即把数据提交给上层应用,而不是缓存起来,如果应用程序不讲接收到的数据读走,就会一直停留在TCP接收缓冲区中;
RST : 如果接收到一个RST=1的报文,说明与主机的连接出现了严重错误(主机崩溃),必须释放连接,然后再重新建立连接。
      或者说上次发送给主机的数据有问题,主机拒绝响应,带SRT标志的报文段被称为复位报文段;
SYN	: 在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,
      表示对方同意建立连接,SYN=1,被称为同步报文段;
FIN	: 通知对方本端要关闭连接了,标记数据是否发送完毕,如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释
      放连接了”,带FIN标志的报文段被称为结束报文段;
窗口 :表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要
      ACK确认后才能继续传送后边的数据。确认的时间为窗口大小乘以一个因子就得到的多长确认一次,窗口的大小是随着
      网络负载而变化	的,不是固定的,而因子是在三次握手之后固定不变的;最大65536
校验和 :是提供额外的可靠性;
紧急指针 :标记紧急指针在数据段的位置;
选项部分 :其最大长度可根据TCP首部长度进行推算,TCP首部长度用4位表示,选项最长部分为:(2^4-1)*4-20=40字节;

TCP的三次握手

在这里插入图片描述

三次握手简单介绍

第一次握手:当客户端主动请求(SYN-SENT)连接服务端,随机一个端口向服务端端口发起SYN=1同步序号请求,发出seq=x
 		  本机序号,
第二次握手:服务端端口随时处于监听(LISENT)状态,当发现有请求连接时,立即做出响应,这时服务器向客户端发起SYN=
		  1同步序号请求,ACK=1是确认之前序号有效(ACK=0时序号无效),并且发出服务端序号seq=y,同时发送ack=
		  x+1(表示客户端发起请求时的seq=x序号服务端收到)。
第三次握手:报文到达客户端时,客户端也立即做出响应,返回ACK=1(表示之前序号有效),seq=x+1(x序号数字之前用过一
		  次,再次发送时为+1),ack=y+1(表示服务端向客户端发起的seq=y客户端已收到)。这时双方握手完毕,可以
		  交换数据。
为什么是三次握手而不是两次呢?
		  如果是两次的话,当客户端第一次发送请求给服务端时,服务端收到请求并返回服务端确认已收到客户端的请求,
		  第二次则是由服务端向客户端返回确认包已收到请求,并同时发送服务端向客户端连接的请求,如果没有第三次
		  的话,服务端根本不清楚客户端是否已收到服务端发给客户端的确认包及请求包,所以三次握手完全是为了可靠,
		  必须经过双方确认才可以交换数据
第四次则是双方开始交换数据

三次握手的半连接队列和全连接队列:

半连接队列:所谓半连接队列就是指,第一次客户端向服务端发起连接请求时,服务端会先查看自己的连接队列中是否还有
		  空位去接收客服端的请求,如果队列满了,服务端则没有能力回应客户端,因为时第一次握手所以为半连接队列。
查看半连接队列容量:
		ss -lnt  | netstat -nt
		cat /proc/sys/net/ipv4/tcp_max_syn_backlog		存放未完成连接队列的数量,默认128,生产环境
		中建议调成1024以上;
全连接队列:全连接队列就是指三次握手完成之后,服务端查看队列中是否还有空位容纳客户端,如果数量已达极限,则无法
		  接纳客户端,如果半连接队列满了,就谈不上全连接队列了。
查看全连接队列:
		cat /proc/sys/net/core/somaxconn	存放完成连接队列的数量,默认128,生产环境中建议调成1024以上;

TCP的四次挥手

在这里插入图片描述

四次挥手简单介绍

在客户端与服务端经过三次握手传送数据完成后,经过四次挥手断开连接,那么,是客户端向服务端请求断开连接?还是服务
端向客户端请求断开连接呢?
	这个是不确定的,通常是客户端请求断开连接。在有些场景下,会是服务端请求断开连接,像如果客户端在连接后,经过
	一段时间没有做任何动作,超过服务器连接时长时,服务器主动会断开连接!
第一次挥手:在连接状态下客户端向服务端发送断开连接请求FIN=1(通知对方本端要关闭连接了,标记数据是否发送完毕,
		  如果FIN=1,即告诉对方:"我的数据已经发送完毕,你可以释放连接了"),seq=u(第一次断开请求序号),此时
		  客户端进入终止等待服务器确认阶段(FIN_WAIT_1)。
第二次挥手:服务端收到FIN=1,seq=u断开连接请求后,回应客户端ACK=1(确认之前序号有效),seq=v(服务端向客户端
		  发送自己的序号),ack=u+1(表示断开请求已收到),但是此时并不是回应确认断开,只是像客户端发送,我收到
		  你的断开请求而已,此时客户端仍是等待服务器确认阶段(FIN_WAIT_2)。
第三次挥手:服务端会检查数据是否传完,如有遗留继续发送,待服务端确认所有数据完成发送之后,因为此前一段时间还是
		  数据传送阶段,所以由服务端向客户端发起请求断开连接,向客户端发送FIM=1(告知客户端以传送完毕),
		  ACK=1(再次发送此前收到的序号有效),seq=w(因为数据传送有时间间隔,所以序号改变),
		  ack=u+1(再次确认断开请求已收到),此时服务端进入最后等待阶段。
第四次挥手:客户端在两次等待后收到服务端的断开请求,立即回应ACK=1(确认序号有效),seq=u+1(第二次序号为+1),
		  ack=w+1(确认服务端seq=w收到)。过程完毕,双方挥手完成,断开连接!

三次握手与四次挥手中的状态信息

有限状态机FSM:Finite State Machine
三次握手状态值:
CLOSED		:没有任何连接状态;	closed:关着的,结束;
LISTEN		:侦听状态,等待来自远方TCP端口的连接请求;		listen:听;
SYN-SENT	:在发送请求后,等待对方确认;		syn:同步	sent:发送;
SYN-RECEIVED:在接收和发送一个连接请求后,等待对方确认;		received:收到的;
ESTABLISHED :代表传输连接建立完成,双方进入传送数据状态;	establish:建立;
四次挥手状态值:
FIN-WAIT-1	:主动关闭,主机已发送关闭连接请求,等待对方确认;	fin:结束	wait:等待;
FIN-WAIT-2	:主动关闭,主机已接收到对方关闭传输请求,等待对方发送关闭传输请求;
TIME-WAIT	:完成双向传输连接关闭,等待所有分组消失;	time-wait:等待时间
CLOSE-WAIT	:被动关闭,接收到对方发来的关闭连接请求,并已确认;	close:关闭,结束;
LAST-ACK	:被动关闭,等待最后一个关闭传输连接确认,并等待所有分钟消失;	last:最后的	ack:确认号;
CLOSING		:双方同时常是关闭传输连接,等待对方确认;		closing:结束的;

抓取状态出现的次数

面试点,拿小本本记下来:
	ss -nt | sed -nr '1!s#([^ ]+).*#\1#p' | sort | uniq -c				
	ss -ant|awk 'NR>1{state[$1]++}END{for(i in state){print i,state[i]}}'
	netstat -ant | sed -nr '/^tcp/s#.* ([[:upper:]]+)#\1#p'|sort|uniq -c
	netstat -nta |awk '/^tcp/{state[$6]++}END{for(i in state){print i,state[i]}}'

UDP特性

工作在传输层
提供不可靠的网络访问
非面向连接协议
有限的错误检查
传输性能高
无数据恢复特性

UDP包头

在这里插入图片描述

UDP包头结构:

源端口:源设备的应用程序端口号;
目的端口:目标设备应用程序的端口号;
报文长度:整个报文大小
校验和:是提供额外的可靠性;
数据:具体要传送的数据内容;

TCP和UDP的区别

TCP传送速度UDP而言相对较慢,因为多可很多中间过程,三次握手等等;
TCP传送数据具有确认机制,UDP没有,发送出去不管了,到不到由网络说了算;
TCP可靠性传输(三次握手和四次挥手)		UDP不可靠(无)
TCP具有数据恢复的能力					UDP没有	
TCP具有数据错误检查功能				UDP检查功能有限,不能说没有,因为UDP有校验和
TCP具有传送数据时流量控制				UDP没有	
TCP具有传送石拥塞控制					UDP没有

简单知识,勿喷~~

猜你喜欢

转载自blog.csdn.net/qq_43058911/article/details/100551564