tcp
1. 报文格式
标志位
URG:指示报文中有紧急数据,应尽快传送(相当于高优先级的数据)。
PSH:为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
RST:TCP连接中出现严重差错(如主机崩溃),必须释放连接,在重新建立连接。
FIN:发送端已完成数据传输,请求释放连接。
SYN:处于TCP连接建立过程。 (Synchronize Sequence Numbers)
ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
2. 三次握手
连接过程
1)TCP服务器进程打开,准备接受客户进程的连接请求,此时服务器进入了LISTEN(监听)状态
2)客户端向服务器发出连接请求报文,这时报文首部SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
3)TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1(确认号),自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
4)当服务器收到客户端的确认后也进入ESTABLISHED状态,双方可以开始通信。
三次握手主要目的是:防止超时导致脏连接。
为什么不是两次握手?
如果使用的是两次握手建立连接,假设客户端发送了第一个请求连接并且没有丢失,只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
3. 四次挥手
几个名词:
FIN:发送端已完成数据传输,请求释放连接。
TIME_WAIT:主动要求关闭的机器表示收到了对方的FIN报文,并发送出了ACK报文,进入TIME_WAIT状态,等2MSL 后即可进入到CLOSED状态。如果FIN_WAIT_1状态下,同时收到待FIN标识和ACK标识的报文时,可以直接进入TIME_WAIT状态,而无需经过FIN_WAIT_2状态。
CLOSE_WAIT:被动关闭的机器收到对方请求关闭连接的FIN报文,在第一次ACK应答后,马上进入CLOSE_WAIT状态。这种状态其实标识在等待关闭,并且通知应用发送剩余数据,处理现场信息,关闭相关资源。
释放过程
1.数据传输完毕,客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2.服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3.客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文。
4.服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5.客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,才进入CLOSED状态。
6.服务器只要收到了客户端发出的确认,立即进入CLOSED状态
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
4. 拥塞控制
拥塞控制: 发送端主动控制cwnd,有慢启动(从cwnd初始为1开始启动,指数启动),拥塞避免(到达ssthresh后,为了避免拥塞开始尝试线性增长),快重传(接收方每收到一个报文段都要回复一个当前最大连续位置的确认,发送方只要一连收到三个重复确认就知道接收方丢包了,快速重传丢包的报文,并TCP马上把拥塞窗口 cwnd 减小到1),快恢复(直接从ssthresh线性增长)。
5. 流量控制
流量控制通过滑动窗口来实现。
Ack是要按顺序的。必须要等到5的Ack收到,才会把6-11的Ack发送过去。这样就保证了滑动窗口的一个顺序。若5号ACK一直未确认,则会进行超时重传
滑动窗口技术通过动态改变窗口大小来调节两台主机间的数据传输。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口:一个用于接收数据,另一个用于发送数据。TCP使用肯定确认技术,其确认号指的是下一个所期待的字节。滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。 只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。
流量控制:端到端,接收端的应用层处理速度决定和网速无关,由接收端返回的rwnd控制
cwnd:发送端窗口( congestion window )
rwnd:接收端窗口(receiver window)
7. 差错控制
TCP使用差错控制来提供可靠性。
差错控制包括以下的一些机制:检测和重传受到损伤的报文段、重传丢失的报文段、保存失序到达的报文段直至缺失的报文到期,以及检测和丢弃重复的报文段。
TCP通过三个简单的工具来完成其差错控制:检验和、确认以及超时。
tcp 与 udp 的区别
TCP:面向连接;面向字节流;可靠交付;全双工通信;只支持一对一;
UDP:无连接不保证可靠;面向报文;无拥塞控制,适合多媒体传输;支持一对多,多对多等;首部开销小
其它
网络通信方式
分组交换,将要发送的数据分成多个数据包,按照一定的顺序排列之后分别发送,在每个分组的首部写入了发送端和接收端的地址。
在分组交换中,由分组交换机(路由器)连接通信线路,发送端计算机将数据发送给路由器,路由器收到这些分组数据以后,缓存到自己的缓冲区,然后在转发给目标计算机。
网卡:计算机连接网络的设备
网桥:数据链路层连接两个网络的设备,能够识别数据链路层中的数据帧并将其转换成一个全新的帧发送给另一个网段
交换机:可以看做持有多个端口的网桥
路由器:作用在网络层,对分组报文进行转发
TCP/IP
是通信协议的统称(包括tcp,ip,udp,http,smtp等)
TCP/IP五层模型:应用(HTTP)-传输(TCP/UDP)-网络(IP协议,负责在没有直连的两个网络之间进行通信传输)-数据链路(提供直连两个设备之间的通信功能)-物理。
物理层将电压高低、光的闪灭、电波强弱转换成二进制的01,数据链路层负责将二进制的01封装成帧,然后再进行传输。
IP协议
主要负责将数据包发送给最终的目标计算机。
ip协议是面向无连接的,ip地址是IP协议的基石。
DNS负责将域名转换为IP地址,ARP负责根据IP找到MAC地址,RARP功能与ARP相反。DHCP可以自动获取IP地址,若DHCP服务器故障,将导致无法分配IP,主机无法联网。socket是应用程序实现TCP/UDP的API
TCP/IP发送数据简要流程
应用层到传输层的TCP,TCP在数据前加上TCP首部,包括源端口与目的端口、校验和等,再到网络层IP协议,IP协议在数据前加上IP首部,IP首部包含源IP与目的IP,再交由路由器进行转发到数据链路层,在数据链路层给数据加上以太网首部,包含MAC地址等,可以通过ARP协议找到MAC地址。
TCP对HTTP性能影响的几个方面:
三次握手,慢启动拥塞控制,Nagle算法(试图在发送分组前,将多个数据包绑定在一起以提高网络效率),用于捎带确认的TCP延迟确认算法(若确认报文较小,可以将其同数据一同发送,为了增加确认报文找到同向传输数据分组的可能性,TCP使用延迟算法,在一个特定的时间窗口停留以寻找能够捎带他的数据分组),TIME_WAIT时延与端口耗尽(TIME_WAIT防止在该段时间内创建两个具有相同IP和端口的连接)。
来源:CSDN
作者:不知道该起什么名字
链接:https://blog.csdn.net/baidu_36885616/article/details/104463151