(1)面向连接的通讯
(2)相同次序交付
(3)可靠性
(4)流量控制
(5)拥塞避免
(6)多路复用
(1)端口介绍
(2)端口号范围
TCP
与UDP
的端口号长度都为16位,即范围为\(0 至 65536\)(3)端口号分类
一般来说:
公认端口(WellKnown Ports)
注册端口(用户端口)(Registered Ports)
动态/私有端口(Dynamicand/ Private Ports)
(4)常用对的服务端口号
21端口:FTP 文件传输服务
22端口:SSH 远程连接服务
23端口:TELNET 终端仿真服务
25端口:SMTP 简单邮件传输服务
53端口:DNS 域名解析服务
80端口:HTTP 超文本传输服务
443端口:HTTPS 加密的超文本传输服务
3306端口:MYSQL数据库端口
5432端口:postgresql数据库端口
6379端口:Redis数据库端口
8080端口:TCP服务端默认端口
8888端口:Nginx服务器的端口
9200端口:Elasticsearch服务器端口
27017端口:mongoDB数据库默认端口
(1)UDP介绍
(2)UDP特点
(1)报文结构
UDP首部共4个字段,每个字段占2个字节,共16个字节
来源端口:发送端进程的端口号,因为UDP报文不需要应答,为可选项,不用可置为0
目的端口:接收端进程的端口号
报文长度:UDP报头和数据总共占用的长度。可能的最小长度是8字节,因为UDP报头已经占用了8字节。由于这个字段的存在,UDP报文总长不可能超过65535字节(包括8字节的报头,和65527字节的数据)。实际上通过IPv4协议传输时,由于IPv4的头部信息要占用20字节,因此数据长度不可能超过65507字节(65,535 ? 8字节UDP报头 ? 20字节IP头部)
校验和:校验和字段可以用于发现头部信息和数据中的传输错误。该字段在IPv4中是可选的,在IPv6中则是强制的。如果不使用校验和,该字段应被填充为全0
(2)校验和的计算
当UDP运行在IPv4之上时,为了能够计算校验和,需要在UDP数据包前添加一个“伪头部”。伪头部包括了IPv4头部中的一些信息,但它并不是发送IP数据包时使用的IP数据包的头部,而只是一个用来计算校验和而已
发送方:
接收方:
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作
数据包结构
来源连接端口(16位长)-识别发送连接端口
目的连接端口(16位长)-识别接收连接端口
序列号(seq
,32位长):代表本次发送的报文是第几号
确认号(ack
,32位长)—期望收到的数据的开始序列号,即已经收到的数据的字节长度加1。
数据偏移(4位长)—以4字节为单位计算出的数据段开始地址的偏移值。
保留(3比特长)—须置0
标志符(9比特长)
NS—ECN-nonce
。ECN显式拥塞通知(Explicit Congestion Notification)是对TCP的扩展,定义于RFC 3540(2003)。ECN允许拥塞控制的端对端通知而避免丢包。ECN为一项可选功能,如果底层网络设施支持,则可能被启用ECN的两个端点使用。在ECN成功协商的情况下,ECN感知路由器可以在IP头中设置一个标记来代替丢弃数据包,以标明阻塞即将发生。数据包的接收端回应发送端的表示,降低其传输速率,就如同在往常中检测到包丢失那样。CWR—Congestion Window Reduced
,定义于RFC 3168(2001)。ECE—ECN-Echo
有两种意思,取决于SYN标志的值,定义于RFC 3168(2001)。URG
—为1表示高优先级数据包,紧急指针字段有效。ACK
—为1表示确认号字段有效PSH
—为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。RST
—为1表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。SYN
—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步FIN
—为1表示发送方没有数据要传输了,要求释放连接。窗口(WIN
,16位长)—表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制。
校验和(Checksum
,16位长)—对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
TCP的16位的校验和(checksum)的计算和检验过程如下:发送者将TCP报文段的头部和数据部分的和计算出来,再对其求反码,就得到了校验和,然后将结果装入报文中传输。(这里用反码和的原因是这种方法的循环进位使校验和可以在16位、32位、64位等情况下的计算结果再叠加后相同)接收者在收到报文后再按相同的算法计算一次校验和。这里使用的反码使得接收者不用再将校验和字段保存起来后清零,而可以直接将报文段连同校验加总。如果计算结果是全部为一,那么就表示了报文的完整性和正确性。
注意:TCP校验和也包括了96位的伪头部,其中有源地址、目的地址、协议以及TCP的长度。这可以避免报文被错误地路由
紧急指针(16位长)—本报文段中的紧急数据的最后一个字节的序号。
选项字段—最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。
(1)建立连接-三次握手
三次握手(Three-way Handshake)是在通信双方建立连接时为了确定对方能够正常接受与发送数据,同步连接双方的序列号和确认号与窗口大小信息,总共需要进行三次报文传送
三次握手不能确定一条线路一定是可靠的,但是可以确认它是可用的
(2)资源使用-TCP连接池
主机收到一个TCP包时,用两端的IP地址与端口号来标识这个TCP包属于哪个session
。使用一张表来存储所有的session,表中的每条称作Transmission Control Block(TCB),tcb结构的定义包括连接使用的源端口、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、tcp输入/输出队列、应用层输出队列、tcp的重传有关变量等。
服务器端的连接数量是无限的,只受内存的限制。客户端的连接数量,过去由于在发送第一个SYN到服务器之前需要先分配一个随机空闲的端口,这限制了客户端IP地址的对外发出连接的数量上限。从Linux 4.2开始,有了socket选项IP_BIND_ADDRESS_NO_PORT,它通知Linux内核不保留usingbind使用端口号为0时内部使用的临时端口(ephemeral port),在connect时会自动选择端口以组成独一无二的四元组(同一个客户端端口可用于连接不同的服务器套接字;同一个服务器端口可用于接受不同客户端套接字的连接)。
(1)序号与确认号
序号包含序号seq
与确认号ack
字段,TCP报文发送者称自己的字节流的编号为序号(sequence number),称接收到对方的字节流编号为确认号。TCP报文的接收者为了确保可靠性,在接收到一定数量的连续字节流后才发送确认。这是对TCP的一种扩展,称为选择确认(Selective Acknowledgement)。选择确认使得TCP接收者可以对乱序到达的数据块进行确认。每一个字节传输过后,SN号都会递增1。
通过使用序号和确认号,TCP层可以把收到的报文段中的字节按正确的顺序交付给应用层。序号是32位的无符号数,在它增大到\(2^{32}-1\)时,便会回绕到0。对于初始化序列号(ISN)的选择是TCP中关键的一个操作,它可以确保强壮性和安全性
(2)确认机制
(3)超时重传
超时重传:超时重传设估计的时间作为收到数据包的确认的超时上限(RTO,Retransmission TimeOut)。当发送了某个报文时,就会启动计时器,如果超过这个上限仍未收到确认包,发送方将重传这个数据包。每当发送方收到确认包后,会重置这个重传定时器,如果多次没有收到确认,便会终止连接,并向上层发送异常信息。
(3)滑动窗口协议(Sliding Window Protocol)
滑动窗口协议用于网络传输时的流量控制,避免因接受端因为机器性能或者网络原因处理不了大量数据而导致无法接受发送方发送数据。
(1)网络拥塞
(2)拥塞窗口
cwnd
(3)慢开始
(4)拥塞避免
拥塞避免:是指为了防止拥塞窗口增长过快,如果增长到某个值时便会进入缓慢增长的状态;
慢启动开始门限(ssthresh)
无论是慢开始算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为发送窗口的一半(>=2),cwnd(拥塞窗口)设置为1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长,比慢启动算法拥塞窗口增长块的多
(5)快重传
(6)快恢复
cwnd
设置为ssthresh
的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大(1)终止连接过程-四次挥手
客户端数据发送完成,则它向服务端发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,客户端将进入FIN-WAIT-1状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号
服务器收到客户端连接释放报文,通知相应的高层应用进程,告诉它客户端向服务器这个方向的连接已经释放了。此时服务端进入了CLOSE-WAIT(关闭等待)状态,并向客户端发出连接释放的应答,其报文头包含:ACK=1,ack=u+1,seq=v
客户端收到该应答后,进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
第二次挥手完成后,客户端到服务端方向的连接已经释放,服务端不会再接收客户端的数据,客户端也没有数据要发送了。但服务端到客户端方向的连接仍然存在,服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间
服务端将最后的数据发送完毕后,就向客户端发送连接释放报文,其报文头包含:FIN=1,ack=u+1,由于在CLOS-WAIT状态,服务端很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
客户端收到服务器的连接释放报文后,向服务端发出确认应答,报文头:ACK=1,ack=w+1,seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。该状态会持续2MSL(最长报文段寿命)时间,这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态,服务端只要收到了客户端发出的确认,立即进入CLOSED状态。就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些
(3)客户端最后还要等待2MSL的原因
(4)为什么是四次挥手?
原文:https://www.cnblogs.com/nishoushun/p/12723417.html