传输层

传输层功能:提供进程之间的逻辑通信,对收到的报文进行差错检验

传输层协议:TCP和UDP

TCP(Transmission Control Protocol 传输控制协议)

用于控制对报文的分段处理,适用于大文件的传输,如文件的上传下载、电影下载、邮件发送等场景;

TCP传输的特点:需要与服务器建立连接(面向连接,三次握手),保证可靠传输,可以进行流量控制,提供全双工通信(打电话),面向字节流,只能是点对点的传输

TCP连接的端点不是主机、IP地址、应用程序或者传输层协议端口,而是套接字(Socket),由IP地址加上端口号构成

TCP首部:固定20字节加可变长度

格式:源端口(2)——目的端口(2)

——序号(4,数据报中第一个字节在整个数据报中的序号)

——确认号(4,数据报中最后一个字节的序号加一)

——数据偏移(4bit,表示从数据偏移*4个字节开始时数据,所以TCP首部最大为60字节)

——保留(6bit)——URG(标记为1时优先发送,不需要排队)——ACK(如果为0确认号为0,例如建立连接等请求时)——PSH(如果设为1,则直接将该段数据发在接受方缓存的最前端)——RST(如果为1代表发生异常中断,需要重新连接)——SYN(发送和确认会话时设置为1)——FIN(释放连接时值为1)——窗口(2,接受缓存的大小,字节为单位)

——校验和(2,和UDP计算方式一样,但是需要该协议号为6)——紧急指针(2,紧急数据的尾部)——可变长度(可有可无,可以通知最大数据报的大小)——填充(4字节的倍数)

SYN攻击,虚造大量IP地址与计算机建立连接

Land攻击,让自己与自己建立大量连接

TCP如何实现可靠传输

停止等待协议

简单但是信道利用率低

自动重传请求(Automatic Repeat reQuest)

流水线传输

发送发维持发送窗口(数据报个数),发送窗口中的数据包可以连续发送,收到确认后向前移动一格

以字节为单位的滑动窗口传输

超时重传:TCP每发送一段报文,就会对这段报文设置一个计时器,直到计时器的重传时结束还没有收到确认就会重传这一段报文

超时重传时间计算:新RTTs = (1 - a)旧的RTTs + a(新的RTT样本)

TCP如何进行流量控制

 在接受方发送确认消息时,同时发送调整窗口的大小,为防止发送端一直等待,发送端也会定时发送试探消息

TCP的拥塞控制

满开始算法:试探性发送,初始从一个数据报开始发送,逐渐翻倍,直到默认慢开始门限,然后递增加一,若发现丢包,则重新计算慢开始门限,为当前值的一半,然后又从一个数据报开始发送(废弃了)

快恢复:发现丢包后,接受方连续发送3个确认给发送方,如果三个确认都收到了的话就直接从新的门限开始递增,而不是从一开始

TCP的传输连接管理

采用客户服务端方式,主动发起请求的应用进程叫做客户端,被动等待请求的进程叫做服务端

三次握手建立连接

第一次:客户端——服务端  SYN = 1;ACK = 0    状态:客户端——SYN_SEND   服务端——LISTEN

第二次:服务端——客户端  SYN = 1;ACK = 1    状态:客户端——ESTABLISHED   服务端——SYN_RECEIVED

第三次:客户端——服务端  ACK = 1;SYN = 0    状态:客户端——ESTABLISHED   服务端——ESTABLISHED

为什么要第三次握手?

防止在第一次握手时客户端发送多次请求(发送延迟,客户端以为发送失败所以重发),服务端收到后返回多个确认,而客户端只确认一个连接,造成服务端一直等待其他多余的连接;所以通过客户端再次确认后服务端才与之建立连接,如果迟迟没有收到确认就不继续等待

TCP连接释放  

四次挥手

第一次:客户端——服务端   FIN  = 1;客户端不再主动向服务端发送数据  状态:客户端——FIN_WAIT-1   服务端——ESTABLISHED

第二次:服务端——客户端   ACK  = 1;服务端继续向客户端发送ACK确认收到消息  状态:客户端——FIN_WAIT-2   服务端——CLOSE_WAIT

第三次:服务端——客户端   FIN = 1;服务端不再向客户端发送数据  状态:客户端——FIN_WAIT   服务端——LAST_ACK

第四次:客户端——服务端   ACK = 1;客户端发出确认消息  状态:客户端——TIME_WAIT   服务端——CLOSE

经过两个MSL(一般是两分钟)后,客户端才会关闭

为什么建立连接只需要三次握手,而释放连接却需要4次挥手?

建立连接时,服务端处于监听状态,收到请求后SYN和ACK可以一起发送,而断开连接时,因为服务端可能不会立即关闭,所以只能先回复ACK确认,等需要的数据传输完成后再发送FIN关闭消息,因此比建立连接时多一步

为什么客户端TIME_WAIT后还需要等待2*MSL后才能关闭?

防止客户端最后的ACK确认消息丢失,所以等待两分钟(如果服务器等待一段时间后没有收到确认消息,会再次发送FIN消息)

UDP (User Datagram Protocol 用户报文协议)

一个数据包就能完成传输,适用于小文件的传输,如QQ消息、DNS解析等场景;无连接,不保证可靠传输、不能进行流量控制、没有拥塞控制、首部很小只有8个字节,可以是一对多传输

UDP的首部格式

源端口——目的端口——UDP数据报长度——校验和,每个部分均占两个字节,计算校验和时需要加上伪首部(12个字节,网络层首部);校验值通过伪首部加UDP数据报的二进制以两个字节为基础进行反码求和,再求反码得到

传输层协议与应用层协议之间的联系

应用层协议 = 传输层协议 + 端口号

例如:http = TCP + 80;https = TCP + 443;RDP = TCP + 3389(远程控制);ftp  = TCP + 21;DNS = UDP + 53;SQL = TCP + 1433等

应用层与服务之间的联系

服务通过与之对应的协议类型和端口号来侦听来自客户端的请求

例如:web----TCP + 80

客户端通过IP地址来连接服务器,通过协议和端口号来连接具体服务

端口的分类 两个字节

熟知端口:0~1023;例如http、https

登记端口:1024~40151

客户端端口:49152~65535

常用网络命令:

netstat -n  显示与客户端建立的对话

netstat -nb  显示建立会话的具体进程

netstat -an  显示正在监听的端口

telnet ip地址 [端口号]  测试该ip地址的指定端口号是否可以连接,端口号默认为23

原文地址:https://www.cnblogs.com/xiao-ji-xiang/p/10001292.html