1,TCP和UDP区别
TCP协议面向连接的协议,提供稳定的双向通信,需要经过“三次握手”才能建立连接;为了提供稳定的数据传输功能,提供了超时重传机制,具有较高的稳定性。
UDP是无连接的,提供不稳定的单向通信功能,当然UDP也可以实现双向通信功能。虽然效率更高,但不能保证数据一定能够正确传输,尤其在网络拥塞的情况下。
1)区别
①TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
②TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
③TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
④每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
⑤TCP首部开销20字节;UDP的首部开销小,只有8个字节
⑥TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
2,TCP三次握手(three-way handshake)和四次分手
TCP用三次握手(three-way handshake)过程创建一个连接,使用四次分手 关闭一个连接。因为TCP是全双工模式,所以四次分手的目的就是为了可靠地关闭连接。
三次握手与四次分手的流程如下所示:
1)两个序号和三个标志位:
①序号
seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
②确认序号
ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
确认方ack=发起方req+1,两端配对。
###③标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。表示已经没有数据 需要发送了。
2)三次握手
①第一次握手:建立连接。
客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
②第二次握手:服务器收到SYN报文段。
服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
③第三次握手:客户端收到服务器的SYN+ACK报文段。
然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态(已建立状态),完成TCP三次握手。 完成了三次握手,客户端和服务器端就可以开始传送数据。
④第三次握手的必要性
三次握手可以保证任何一次握手的失败都是可感知的,不会浪费资源。
否则,对于两次握手:A发送建立连接,B确认后就建立连接;在网络延迟的情况下,A第一次发送建立连接,B未响应,A第二次又发送建立连接,B建立连接。传输完成后关闭连接,当A第一次延迟的建立连接请求发送到B时,B建立连接,并且一直等待A发送数据,但对于A来说,连接已经关闭了。这样就造就了B一直在等待发送数据。
对于三次握手,A请求建立连接,B建立连接,A确认建立连接。A如果长时间未确认建立连接,B就会关闭连接。
⑤为什么不是四次握手
如果四次,那么就造成了浪费,因为在三次结束之后,就已经可以保证A可以给B发信息,A可以收到B的信息; B可以给A发信息,B可以收到A的信息。
⑥握手失败
第一次握手A发送SYN传输失败,A,B都不会申请资源,连接失败。如果一段时间内发出多个SYN连接请求,那么A只会接受它最后发送的那个SYN的SYN+ACK回应,忽略其他回应全部回应,B中多申请的资源也会释放
第二次握手B发送SYN+ACK传输失败,A不会申请资源,B申请了资源,但收不到A的ACK,过一段时间释放资源。如果是收到了多个A的SYN请求,B都会回复SYN+ACK,但A只会承认其中它最早发送的那个SYN的回应,并回复最后一次握手的ACK
第三次握手ACK传输失败,B没有收到ACK,释放资源,对于后序的A的传输数据返回RST。实际上B会因为没有收到A的ACK会多次发送SYN+ACK,次数是可以设置的,如果最后还是没有收到A的ACK,则释放资源,对A的数据传输返回RST
3)四次分手
收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。
①第一次分手:表示主机1没有数据要发送给主机2了。
主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;
②第二次分手:主机2告诉主机1,我“同意”你的关闭请求。
主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
③第三次分手:请求关闭。
主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
④第四次分手:正常关闭。
主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
⑤为什么分手比握手多一次
A给B发送FIN报文段,表示A没有数据发给B,但是B可能还有数据发给A。所以需要多确认一次。
3,TCP如何保证数据传输的可靠性?
1)确认和重传
接收方收到报文后就会进行确认,发送方一段时间没有收到确认就会重传。(见TCP重传机制)
2)数据校验
数据合理分片与排序,TCP会对数据进行分片,接收方会缓存为按序到达的数据,重新排序后再提交给应用层。
3)流程控制
当接收方来不及接收发送的数据时,则会提示发送方降低发送的速度,防止包丢失。
4)拥塞控制
当网络发生拥塞时,减少数据的发送。
4,TCP重传机制
传输过程中发生丢包,则需要使用重传机制。
1)超时重传机制(RTO)
在请求包发出去的时候,开启一个计时器,当计时器达到时间之后,没有收到ACK,就进行重发请求的操作,一直重发直到达到重发上限次数或者收到ACK。
例如:接收端给发送端的Ack确认只会确认最后一个连续的包,比如,发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,于是回ack 3,然后收到了4(注意此时3没收到),此时的TCP会怎么办?等待发送端的ACK 3,直到超时后,就会再发送3。
面临问题,重传是重传#3呢还是重传#3,#4,#5呢?
2)快速重传机制(Fast Recovery)
当接收方收到的数据包是不正常的***,那么接收方会重复把应该收到的那一条ACK重复发送,这个时候,如果发送方收到连续3条的同一个***的ACK,那么就会启动快速重传机制,把这个ACK对应的发送包重新发送一次。
例如:如果发送方发出了1,2,3,4,5份数据,第一份先到送了,于是就ack回2,结果2因为某些原因没收到,3到达了,于是还是ack回2,后面的4和5都到了,但是还是ack回2,因为2还是没有收到,于是发送端收到了三个ack=2的确认,知道了2还没有到,于是就马上重转2。然后,接收端收到了2,此时因为3,4,5都收到了,于是ack回6。
同样面临问题:是重传#2呢还是重传#2,#3,#4,#5呢?
①不启用sack的reno式重传
②sack重传
5,TCP阻塞
1)慢启动
当一个连接连接上网络的时候,并不应该一次向网络中就发送大量的数据包,否则的话,如果网络链路状况不是很好的情况,这些网络包可能会加重网络拥堵的情况。所以最初TCP连接建立之后,发送网络包的大小是逐渐增长的,最开始是1个最大报文大小,然后是指数级增长。这个就是慢启动机制。
但是到了一个数值,就不能再进行指数增长了,这个时候,网络包增长就从指数增长改成线性增长,就是一次增加一个MSS。这个就是拥塞避免阶段。
2)Nagle算法
如果每个网络传输都只传输一个小包,会浪费资源,增加拥堵。糊涂窗口综合症就是发送方和接收方糊里糊涂达成的协商是传送小包。
为了解决这个问题,很多方法应运而生,Nagle算法就是其中一个方法。
Nagle算法规定了,发送方网络链路上一个连接只能有一个未获得ACK的请求包。这个就意味着,发送方只有等待上一个请求的ACK回来之后才能发送下一个请求,这样两个请求过程中间,发送方的缓存区就存储了足够滑动窗口大小的包进行传递,这样就有效避免了大量的小包产生。
3)Cork算法
另外一种解决糊涂窗口综合症的方法就是Cork算法。这个算法比Nagle算法更激进一些,直接计算出一个值,当发送方的滑动窗口大小小于这个值的时候,不进行数据包的发送。这样这个算法就能有效直接杜绝小包的出现了。当然可能会导致数据有一定的延迟性了。
Nagle和Cork算法都是在发送方进行控制,两个算法的着重点不同,Cork算法着重点在于避免小包,更多是端到端的优化。Nagle算法则是为了提高网络的利用率。
4)延迟ACK
延迟ACK算法是从接收方防止糊涂窗口综合症。
接收方并不是收到请求之后立刻发送ACK,而是开启一个计时器,等到计时器结束的时候,才发送ACK。或者是接收方在需要回发送请求的时候,顺带着把上个请求的ACK发送回去了。这个机制如果配合Nagle算法,能让连接的滑动窗口达到一个预期的比较好的值。
6,网络协议
1)OSI体系(Open System Interconnect,OSI参考模型)
通信子网一般只包含最低的三层甚至两层。
数据报在传输层加远端口号和目的端口号;
在网络层加上原ip和目的ip ;
在数据链路层转化成数据桢进行校验;
在物理层变成信号(电、光、等信号)发送出去。
共7层。从低层到高层依次为:
①物理层
完成实际通信。是唯一直接传输数据(比特流)的一层.
功能:
i>在物理媒介上正确地、透明地传送比特流(二进制传输)。
ii>屏蔽掉物理设备和传输介质的差异,为数据链路层提供一个统一的数据传输服务。
②数据链路层
功能:输入介质。
以帧位单位传输数据。
主要功能:加强物理层传输原始位流的功能,同时将物理层可能出错的物理连接修改成逻辑上无差错的数据链路。
对数据传输进行差错控制和流量控制是数据链路层的关键功能。
常用协议:SLIP,PPP,X.25,帧中继。
常用差错检测:奇偶校验码、循环冗余码。
③网络层
功能:寻址和最短路径。
数据传输单位是分组。
主要功能:选择合适的路由,将运输层分送的分组准确传输。
④传输层
功能:端到端连接。
运输层的重要功能:复用和分用。
复用:将应用层多个端口数据报传送到网络层
分用:将网络层报文段拆除head之后发送给多个端口的socket
常用协议:
SPX:顺序包交换协议,是Novell NetWare网络的传输层协议。
TCP:传输控制协议,是TCP/IP参考模型的传输层协议。
⑤会话层
功能:互连主机通信。
不参与具体的数据传输,但为数据交互建立规则。
⑥表示层
功能:数据表示。
为异种机通信提供一种公共语言,完成应用层数据所需的任何转换,以便进行交互操作。
⑦应用层
功能:处理网络应用。
为端用户服务。
⑧各层协议
| OSI层 | 协议 |
|---|---|
| 应用层 | DHCP · DNS · FTP · Gopher · HTTP · IMAP4 · IRC · NNTP · XMPP · POP3 · SIP · SMTP SNMP · SSH · TELNET · RPC · RTCP · RTP ·RTSP · SDP · SOAP · GTP · STUN · NTP · SSDP |
| 表示层 | HTTP/HTML · FTP · Telnet · ASN.1(具有表示层功能) |
| 会话层 | ADSP·ASP·H.245·ISO-SP·iSNS·NetBIOS·PAP·RPC· RTCP·SMPP·SCP·SSH·ZIP·SDP(具有会话层功能) |
| 传输层 | TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP |
| 网络层 | IP (IPv4 · IPv6) · ICMP · ICMPv6 · IGMP ·IS-IS · IPsec · BGP · RIP · OSPF ·ARP · RARP |
| 数据链路层 | Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ATM · DTM · 令牌环 · 以太网路 ·FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN ·STP |
| 物理层 | 以太网路卡 · 调制解调器 · 电力线通信(PLC) · SONET/SDH(光同步数字传输网) ·G.709(光传输网络) · 光导纤维 · 同轴电缆 · 双绞线 |
2)TCP/IP参考模型
TCP/IP协议是物理层上的一组完整的网络协议。TCP提供运输层服务,IP提供网络层服务。
TCP/IP参考模型没有表示层和会话层,包括4层(从上到下):
①应用层
最高层,包含所有的高层协议:远程登录协议TELNET、文件传送协议FTP、简单邮件传送协议SMTP、域名服务DNS、网络新闻传送协议NNTP、超文本传送协议HTTP。
②运输层
功能:保障端到端可以会话。
这一层由2个端到端的协议:TCP、UDP。
③互联网层(网络层)
定义了正式的分组格式和协议,即IP协议。
功能:把IP分组发送到应该去的地方。
分组路由和避免阻塞是这里最主要的设计问题。
④网络接口层
几乎没有定义协议,以便TCP/IP协议适应几乎全部硬件平台。
4)传输控制协议(Transmission Control Protocol,TCP)
面向连接的协议,将输入的字节流分成报文段传给互联网层。
TCP处理流量控制,以避免快速发送方给低速接收方发送过多的报文而使接收方无法处理。
TCP粘包问题
5)用户数据报协议(User Datagram Protocol,UDP)
是一个不可靠的、无连接的协议,用于不需要TCP排序和流量控制能力的程序。
6)IP协议(Internet Protocol)
主要关心的是如何将数据从一个设备经过一个互联网络发送到另一个设备,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。
IP协议是用于将多个包交换网络连接起来的,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
7)ARP(Address Resolution Protocol,地址解析协议)
根据IP地址获取物理地址的一个TCP/IP协议。
主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
8)RARP(Reverse Address Resolution Protocol,反向地址转换协议)
RARP以与ARP相反的方式工作。
RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址。虽然发送方发出的是广播信息,RARP规定只有RARP服务器能产生应答。许多网络指定多个RARP服务器,这样做既是为了平衡负载也是为了作为出现问题时的备份。
9)ICMP(Internet Control Message Protocol,互联网控制报文协议)
ICMP是Internet中一个差错和控制报文协议。
IP通过ICMP来交换错误信息或者其他重要信息 ,它工作在网络层。
10)voip(Voice over Internet Protocol)
模拟信号(Voice)数字化,以数据封包(Data Packet)的形式在IP网络(IP Network)上做实时传递。
常用协议:sip会话发起协议,MGCP媒体网关控制协议,MEGACO(媒体网关之间的协议),h.323(IP电话)
11)DNS(DomainNameSystem,域名系统)
是进行域名解析的服务器,完成域名与IP地址映射。
12)协议访问顺序
①一台刚刚接入互联网的WEB服务器第一次被访问到时,不同协议的发生顺序:
ARP -> DNS -> HTTP
1、当给WEB服务器接上网线的时候,它会自动发送一条ARP信息,使得接入网关能找的到它;
网关上会形成一条类似:2c 96 1e 3c 3e 9b - 192.168.1.123的MAC地址到IP地址的映射记录。
2、当第一个用户使用域名访问WEB服务器的时候,首先要进行一次DNS查询
3、最后才是http协议
7,UDP丢包
1)原因
①接收端处理时间过长
调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。
对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
或者一个线程用于接收数据,一个线程用于处理数据。
②发送的包巨大
虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。
③接受者接收缓存区不足
包超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。
④发送的包频率太快
虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包,原因就是UDP的SendTo不会造成线程阻塞。这种情况也有时可以通过设置socket接收缓冲解决,但有时解决不了。所以在发送频率过快的时候还是考虑sleep一下吧。
⑤局域网内不丢包,公网上丢包
这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。总之udp丢包总是会有的,如果出现了用我的方法解决不了,还有这个几个方法: 要么减小流量,要么换tcp协议传输,要么做丢包重传的工作。
8,在浏览器中输入网址后都发生了什么
1)浏览器发起DNS查询请求
浏览器会根据本地客户端DNS服务器配置(下图为DNS服务器配置),向DNS服务器获取域名对应的IP地址。
2)域名服务器向客户端返回查询结果域名,从而完成域名到IP地址的转换。
3)客户端向web服务器发送HTTP请求
在得到了域名对应的IP地址后,客户端便可以向真正的web服务器发生HTTP请求了。
4)发送响应数据给客户端
Web服务器通常通过监听80端口,来获取客户端的HTTP请求。与客户端建立好TCP连接后,web服务器开始接受客户端发来的数据,并通过HTTP解码,从接受到的网络数据中解析出请求的url信息以前其他诸如Accept-Encoding、Accept-Language等信息。