计算机网络——TCP/UDP

1. TCP UDP 区别,分别适用什么场景?

  • TCP面向连接(三次握手),通信前需要先建立连接;UDP面向无连接,通信前不需要连接。
  • TCP通过序列号、确认应答,超时重传、流量控制、拥塞控制实现可靠传输;UDP不保障可靠传输,尽最大努力交付。
  • TCP面向字节流传输,因此可以被分割并在接收端重组;UDP面向数据报传输。
  • TCP支持点对点单播,UDP支持单播,多播和广播
  • TCP首部开销大,20字节。UDP首部8字节。
  • UDP简单,可应用于多媒体应用,TCP相对复杂,应用于FTP,电子邮件等

2. TCP怎么保证可靠传输

  • (1)序列号、确认应答、超时重传
    数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认号说明了它下一次需要接收的数据序列号。若发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送发在等待一段时间后进行重传。
  • (2)流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
  • (3)拥塞控制:当网络拥塞时,减少数据的发送。

3. TCP 三次握手和四次挥手(详细),TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
(1)TCP状态转换图
在这里插入图片描述
(2)TCP三次握手
在这里插入图片描述

  • (1)假定主机A运行的是TCP客户程序,B运行TCP服务器程序,最初两端的进程都处于CLOSE状态。A主动打开,B被动打开。
  • (2)B先创建传输控制块TCP,然后处于Listen状态,等待客户请求连接。
  • (3)A在打算进行建立连接时,向B发送请求报文含有SYN=1,seq=x。(注意,规定SYN报文段不能携带数据)。这时,客户端进程进入SYN_SENT(同步已发送) 状态。
  • (4)B收到连接请求后,如果同意建立,就向A发送确认。传输内容有SYN=1,ACK=1,seq=y,ack=x+1。TCP服务器端进入SYN_RCVD(同步收到)状态
  • (5)TCP客户端收到B的确认后,还要向B给出确认。ACK=1,ack=y+1,seq=x+1。(TCP规定ACK报文段可以携带数据,若不携带数据,下一次发送序号seq=x+1)。这时候A进入ESTABLISHED(已建立连接) 状态。

(3)TCP四次挥手
在这里插入图片描述

  • (1)当前A和B都处于ESTABLISHED状态,当数据传输结束后,通信的双方都可以释放连接。A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A发送 FIN=1,seq=u。此时A进入FIN-WAIT-1(终止等待1) 状态,等待B的确认。(FIN即使不传输数据也消耗一个序号)
  • (2)B收到里报文段后即发出确认,内容为:ACK=1,seq=v,ack=u+1。然后B进入到CLOSE-WAIT(关闭等待) 状态。TCP此时应通知服务器端的高层应用进程,因为从A到B这个方向的连接就是放了,此时的TCP连接处于半关闭 状态,即A已经没有数据要发送了,但B若发送数据,A要接受。
  • (3)A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2) 状态
  • (4)等待B发出的连接释放报文段。若B已经没有要发送的报文了,就通知TCP释放连接。发送内容为:FIN=1,seq=w(可能在瓣关闭状态又发送了一些报文),ack=u+1。此时B进入了LAST-ACK(最后确认)状态。
  • (5)A收到B连接释放报文后必须发出确认,内容为:ACK=1,seq=u+1,ack=w+1。然后A进入到了TIME-WAIT(时间等待) 状态。必须经过2MSL后,A才进入到CLOSE状态。
  • (6)B端收到确认报文后立即进入CLOSE状态,

4. TCP中断连接时为什么要有time_wait状态?TIME_WAIT的意义(为什么要等于2MSL)
MSL叫做最长报文段寿命。

  • (1) 为了保证A发出的最后一个ACK报文段能够到达B
  • (2) 防止“已失效的连接请求报文段”出现在本连接中

5. TCP连接的建立为什么是三次握手而不是两次握手?为什么客户端最后还要发送一次确认呢
如果仅两次连接可能出现一种情况:客户端发送完连接报文(第一次握手)后由于网络不好,延时很久后报文到达服务端,服务端接收到报文后向客户端发起连接(第二次握手)。此时客户端会认定此报文为失效报文,但在两次握手情况下服务端会认为已经建立起了连接,服务端会一直等待客户端发送数据,但因为客户端会认为服务端第二次握手的回复是对失效请求的回复,不会去处理。这就造成了服务端一直等待客户端数据的情况,浪费资源。

6. TCP为什么挥手是四次而不是三次
(1)TCP是全双工的,它允许两个方向的数据传输被独立关闭。当主动发起关闭的一方关闭连接之后,TCP进入半关闭状态,此时主动方可以只关闭输出流。
(2)之所以不是三次而是四次主要是因为被动关闭方将"对主动关闭报文的确认"和"关闭连接"两个操作分两次进行。
(3)对主动关闭报文的确认是为了快速告知主动关闭方,此关闭连接报文已经收到。此时被动方不立即关闭连接是为了将缓冲中剩下的数据从输出流发回主动关闭方(主动方接收到数据后同样要进行确认),因此要把"确认关闭"和"关闭连接"分两次进行。

7. TCP拥塞控制详解,以及算法名字?(极其重要)
网络中的链路容量和交换结点中的缓存和处理机都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

cwnd: 拥塞窗口
ssthresh: 慢开始门限
发送方让自己的发送窗口等于拥塞窗口
在这里插入图片描述
当cwnd< ssthresh,cwnd以慢开始的方法指数增长;
cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
当cwnd> ssthresh,cwnd以拥塞避免的方法线性增长。
新ssthresh=原来的ssthresh/2
在这里插入图片描述
快重传:收到3个同样的确认就立刻重传,不等到超时,立刻重传该包;
快恢复:cwnd不是从1重新开始,从上一个ssthresh/2+3开始,采用拥塞避免算法
总体:加法增大AI,乘法减小MD

  • 慢开始门限减半;
  • cwnd设为慢开始门限减半后的数值;
  • 执行拥塞避免算法(高起点,线性增长);

8. 流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征)?
(1)介绍
流量控制是通过滑动窗口为了控制发送方发送速率,保证接收方来得及接收。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。例如将窗口字段设置为 0,则发送方不能发送数据。
(2)问题

  • 死锁:B向A发送0窗口报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送rwnd=400报文,但是这个报文在传输过程中丢失了,而现在A一直在等着B发送的非0窗口的报文,B也一直等A发送的数据,这样就会互相等待的死锁局面。
  • 糊涂窗口综合征 :TCP接收方的存储已经满了,而交互进程一次只从缓存区读取一个字节,这样缓存去腾出一个字节空间,给A发送确认,窗口大小为1,接着发来了一个字节的数据。这样一直下去,网络的效率很低。

(3)解决方法

  • 为了处理死锁问题,TCP引入了持续计时器(Persistence timer),当A收到对方的零窗口通知时,就启用该计时器,时间到则发送一个1字节的探测报文,对方会在此时回应自身的接收窗口大小,如果结果仍未0,则重设持续计时器,继续等待。
  • 使用Nagle算法解决糊涂窗口综合征的问题。
    (1)若发送应用进程要把发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面的字节先缓存起来;
    (2)当发送方收到第一个字节的确认后(也得到了网络情况和对方的接收窗口大小),再把缓冲区的剩余字节组成合适大小的报文发送出去;
    (3)让接收方等待一段时间,使得接受缓存区已有足够的空间容纳一个最长的报文段,或者等待接收缓存已经有了一半的空闲空间。有这两种情况之一,就发送确认报文。

9. 拥塞控制和流量控制的区别,发送窗口的大小取决于流量控制还是拥塞控制?

  • 拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。
  • 流量控制:指点对点通信量的控制,是端到端中的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收
  • 发送窗口的大小=Min[拥塞窗口,接收窗口],因此是两种控制共同作用。

10. 有没有不是因为拥塞控制而引起的分组丢失的情况?如果有,举例。
(1)IP数据包在数据传输的时候需要分片,但其中一个未能及时到达终点,而终点组装IP数据包已经超时,因而只能丢弃该数据报。
(2)IP数据报已经到达终点,但是终点的缓存没有足够的空间存放此数据
(3)数据报在转发过程中经过一个局域网的网桥,但是网桥在转发该数据报的帧的时候没有足够的差错空间而丢弃。

11. TCP传输数据时,如果有一个确认报文丢失了,也不一定会引起与该确认报文段对应数据的重传。说明理由
尚未重传便收到了对更高序号的确认。

12. 怎么解决TCP的粘包问题?TCP/IP的分片粘包过程
(1)产生黏包的原因?

  • 发送方要等缓存区满才发送数据;应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
  • 接收方法不及时读取套接字缓冲区数据,这将发生粘包。

(2)如何处理粘包、拆包

  • 编程可以强制数据立即传送指令push
  • 优化接收方的设计,提高接受进程优先级,使接收方及时接收数据
  • 使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。
  • 设置定长消息,服务端每次读取既定长度的内容作为一条完整消息,当消息不够长时,空位补上固定字符。

13. UDP报文大小最多是多少
(1)以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的. 这个1500字节被称为链路层的MTU(最大传输单元)。并不包括链路层的首部和尾部的18个字节.
所以,事实上,这个1500字节就是网络层IP数据报的长度限制. 因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节. 而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的. 又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节. 这个1472字节就是我们可以使用的字节数。
(2)当我们发送的UDP数据大于1472的时候会怎样呢?
这也就是说IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片。把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报。

14. UDP如何实现可靠传输?
传输层无法保证数据的可靠传输,可以通过应用层来实现。最简单的方式是在应用层模仿传输层TCP的可靠性传输。

  • 1、添加seq/ack机制,确保数据发送到对端
  • 2、添加发送和接收缓冲区,主要是用户超时重传。
  • 3、添加超时重传机制。

15. nagle算法了解吗?
若发送应用进程把要发送的数据逐个字节的送到TCP的发送缓存,则发送发就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢的时候,用这样的方法可以明显的减少所用的网络带宽。nagle算法还规定,当到达的数据以达到发送窗口大小的一半或已到达报文段的最大长度时,就立即发送一个报文段。这样可以有效地提高网络的吞吐量。

16. TCP三次握手,三次握手中第二次握手的SYN和ACK可不可以分开发
可以,这样会降低效率。

17. 网络7层和4层模型的区别

  • 应用层(用户对用户)
    任务:提供系统与用户的接口
    功能:①文件传输;②访问和管理;③电子邮件服务
    协议:FTP、SMTP、POP3、HTTP

  • 传输层(运输层)(应用对应用进程对进程)
    传输单位:报文段(TCP或用户数据报(UDP))
    任务:负责主机中两个进程之间的通信
    功能:①为端到端连接提供可靠的传输服务;②为端到端连接提供流量控制、差错控制、服务质量等管理服务
    协议:TCP、UDP

  • 网络层(网际层、IP层)(主机对主机)
    传输单位:数据报
    所实现的硬件:路由器
    任务:①将传输层传下来的报文段封装成分组;②选择适当的路由,使传输层传下来的分组能够交付到目的主机
    功能:①为传输层提供服务;②组包和拆包;③路由选择;④拥塞控制
    协议:ICMP、ARP、RARP、IP、IGMP

  • 数据链路层(链路层)
    传输单位:帧
    所实现的硬件:交换机、网桥
    任务:将网络层传下来的IP数据报组装成帧
    功能:①链路连接的建立、拆除、分离;②帧定界和帧同步;③差错检测
    协议:PPP、HDLC、ARQ

  • 物理层
    传输单位:比特
    所实现的硬件:集线器、中继器
    任务:透明地传输比特流
    功能:为数据端设备提供传送数据通路

  • 主机A和主机B通信的实质是什么?
    我们把A栋楼和B栋楼看成是两台主机,A栋楼的甲想把某物品给B栋楼的乙,甲和乙分别看成是主机上的两个进程,则类似两台主机传送数据,那么甲所给的物品不能仅仅只放在B栋楼的门口,肯定要将物品交给乙的手上才行,所以说两台主机的通信实质上是两台主机的进程在相互通信。再补充一点:假设A、B宿舍都是单人间,每个房间只有一个人(一个进程〕,那么房间号就是端口号。

  • OSI参考模型和TCP/IP模型的区别
    (1)OSI参考模型
    ①3个主要概念:服务、接口、协议
    ②协议有很好的隐藏性
    ③产生在协议发明之前
    ④共有7层
    网络层:连接和无连接
    传输层:仅有面向连接
    (2)TCP/IP模型
    ①没有明确区分服务、接口、协议
    ②产生在协议发明之后
    ③共有4层(不是5层)
    网络层:仅有无连接
    传输层:面向连接和无连接

  • 关于OSI参考模型的工作原理
    通过给朋友发一封电子邮件的例子来解释7层的工作原理。在发电子邮件的过程中,首先要在应用层来编辑这封信件,然后再把编辑好的信件发给表示层,这时表示层会把这封信件加密,当然也可以不加密,为了提高速度表示层就要把它压縮,然后再转给会话层,这时会话层就会把信息发给你,并提示,你要给别人发邮件了,要你准备好,然后再把这个信息发送给传输层,这时传输层就会把这封信件分段,其目的是数据无法一次被传输,所以要分段,然后被分割的信件再次被传输到网络层,这时网络会对数据段再次进行封装并加入报头(形成数据报),其实从应用层开始每往下层传输一次就会加入一次报头(在数据链路层既要加报头又要加报尾)及其相关信息。不仅如此,网络层还要对传输路径进行一种选择,之后再传给数据链路层,数据链路层将这些数据报封装成帧(这里就是人们通常所说的以太网),最后再把这个信息发送到物理层形成比特流,进而送到传输媒体(或者直接称为网线),这时信件就会变成比特流在网线上传输了,此时我的计算机就完成了发送过程,而我朋友的计算机负责接收该电子邮件,自然这个过程就是相反的了。

18. 当接受方的接受窗口为0时还能接受数据吗?为什么?还能接受什么数据?那怎么处理这些数据呢?
可以接受。
数据:零窗口探测报文;确认报文段;携带紧急数据的报文段
可能会被抛弃

19. TCP首部
在这里插入图片描述
第一个4字节:
源端口,16位;发送数据的源进程端口
目的端口,16位;接收数据的进程端口

第二,三个4字节:
序号,32位;代表当前TCP数据段第一个字节占整个字节流的相对位置;
确认号,32位;代表接收端希望接收的数据序号,为上次接收到数据报的序号+1,当ACK标志位为1时才生效。

第四个4字节:
数据偏移,4位;实际代表TCP首部长度,最大为60字节。
6个标志位,每个标志位1位;
SYN,为同步标志,用于数据同步;
ACK,为确认序号,ACK=1时确认号才有效;
FIN,为结束序号,用于发送端提出断开连接;
URG,为紧急序号,URG=1是紧急指针有效;
PSH,指示接收方立即将数据提交给应用层,而不是等待缓冲区满;
RST,重置连接。
窗口值,16位;标识接收方可接受的数据字节数。

第五个4字节:
校验和,16位;用于检验数据完整性。
紧急指针,16位;只有当URG标识位为1时,紧急指针才有效。紧急指针的值与序号的相加值为紧急数据的最后一个字节位置。用于发送紧急数据。

20. UDP首部
在这里插入图片描述

  • 端口号:用来表示发送和接受进程。由于 IP层已经把IP数据报分配给TCP或UDP(根据I P首部中协议字段值),因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。
  • 长度:UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为 8字节(发送一份0字节的UDP数据报是 0K)。
  • 检验和:UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。

21. 在TCP连接中,服务端的socket要做哪些?
每个tcp连接的两端都会关联一个套接字和该套接字指向的文件描述符。
当服务端收到了ack消息后,就表示三次握手完成了,表示和客户端的这个tcp连接已经建立好了。连接建立好的一开始,这个tcp连接会放在listen()打开的established queue队列中等待accept()的消费。
这个时候的tcp连接在服务端所关联的套接字是listen套接字和它指向的文件描述符。
当established queue中的tcp连接被accept()消费后,这个tcp连接就会关联accept()所指定的套接字,并分配一个新的文件描述符。也就是说,经过accept()之后,这个连接和listen套接字已经没有任何关系了。连接还是那个连接,只不过服务端偷偷地换掉了这个tcp连接所关联的套接字和文件描述符,而客户端并不知道这一切。但这并不影响双方的通信,因为数据传输是基于连接而不是基于套接字的,只要能从文件描述符中将数据放入tcp连接这根"管道"里,数据就能到达另一端。

监听套接字是在服务进程读取配置文件时,从配置文件中解析出要监听的地址、端口,然后通过socket()函数创建的,然后再通过bind()函数将这个监听套接字绑定到对应的地址和端口上。随后,进程/线程就可以通过listen()函数来监听这个端口(严格地说是监控这个监听套接字)。
已连接套接字是在监听到TCP连接请求并三次握手后,通过accept()函数返回的套接字,后续进程/线程就可以通过这个已连接套接字和客户端进行TCP通信。
在这里插入图片描述

22. 如果 server 没有 accept,连接会怎样?
并不一定需要accept()才能进行tcp通信,因为在accept()之前连接就以建立好了,只不过它关联的是listen套接字对应的文件描述符,而这个套接字只识别三次握手和四次挥手涉及到的数据,而且这个套接字中的数据是由操作系统内核负责的。可以想像一下,只有listen()没有accept()时,客户端不断地发起connect(),服务端将一直将建立仅只连接而不做任何操作,直到listen的队列满了。

23. 说明socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的
由于是双向的,两边都要发FIN,服务器关闭socket,用close会将该socket的计数-1,如果引用还是大于0,那么socket端口状态保持不变,如果为0,会将sender缓冲中的数发出去,然后发送FIN。可能在多进程中出现半关闭,所以应该使用

shutdown(sockfd, SHUT_RDWR); close(sockfd);
shutdown不考虑描述符的引用计数,直接关闭描述符,到LAST_ACK状态。也可选择中止一个方向的连接,只中止读或只中止写。

如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放。

在多进程中如果一个进程调用了shutdown(sfd, SHUT_RDWR)后,其它的进程将无法进行通信。但,如果一个进程close(sfd)将不会影响到其它进程。

就是说可能会有多个进程共享使用一个socket。其它的系统调用有

  • 客户端:socket,bind,connect,send,recv,close
  • 服务器:socket,bind,listen,accept,recv,send,close

24. shutdown() 和 close() 有什么区别?如何优雅关闭 socket ?

通用的close()函数可以关闭一个文件描述符,当然也包括面向连接的网络套接字描述符。当调用close()时,将会尝试发送send buffer中的所有数据。但是close()函数只是将这个套接字引用计数减1,就像rm一样,删除一个文件时只是移除一个硬链接数,只有这个套接字的所有引用计数都被删除,套接字描述符才会真的被关闭,才会开始后续的四次挥手中。对于父子进程共享套接字的并发服务程序,调用close()关闭子进程的套接字并不会真的关闭套接字,因为父进程的套接字还处于打开状态,如果父进程一直不调用close()函数,那么这个套接字将一直处于打开状态,将一直进入不了四次挥手过程。

而shutdown()函数专门用于关闭网络套接字的连接,和close()对引用计数减一不同的是,它直接掐断套接字的所有连接,从而引发四次挥手的过程。可以指定3种关闭方式:

  • 1.关闭写。此时将无法向send buffer中再写数据,send buffer中已有的数据会一直发送直到完毕。
  • 2.关闭读。此时将无法从recv buffer中再读数据,recv buffer中已有的数据只能被丢弃。
  • 3.关闭读和写。此时无法读、无法写,send buffer中已有的数据会发送直到完毕,但recv buffer中已有的数据将被丢弃。

无论是shutdown()还是close(),每次调用它们,在真正进入四次挥手的过程中,它们都会发送一个FIN。

25. 大端和小端的区别?网络字节序是哪一个?
大端:低地址——高位
小端:低地址——低位
网络字节序采用大端字节序

26. UDP bind 和 connect 有什么用?

  • udp客户端使用connect()函数
    udp客户端建立了socket后可以直接调用sendto()函数向服务器发送数据,但是需要在sendto()函数的参数中指定目的地址/端口,但是可以调用connect()函数先指明目的地址/端口,然后就可以使用send()函数向目的地址发送数据了,因为此时套接字已经包含目的地址/端口,也就是send()函数已经知道包含目的地址/端口。
  • udp客户端程序使用bind()函数
    udp服务器调用了bind()函数为服务器套接字绑定本地地址/端口,这样使得客户端的能知道它发数据的目的地址/端口,服务器如果单单接收客户端的数据,或者先接收客户端的数据(此时通过recvfrom()函数获取到了客户端的地址信息/端口)再发送数据,客户端的套接字可以不绑定自身的地址/端口,因为udp在创建套接字后直接使用sendto(),隐含操作是,在发送数据之前操作系统会为该套接字随机分配一个合适的udp端口,将该套接字和本地地址信息绑定。
    但是,如果服务器程序就绪后一上来就要发送数据给客户端,那么服务器就需要知道客户端的地址信息和端口,那么就不能让客户端的地址信息和端口号由客户端所在操作系统分配,而是要在客户端程序指定了。怎么指定,那就是用bind()函数

27. write 和 sendto 有什么区别?(recv,write,send,read,recvfrom,sendto区别)

  • 一般情况下:
    send(),recv()用于TCP,sendto()及recvfrom()用于UDP
  • 但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用于TCP
  • sendto可以在参数中指定发送的目标地址 , send需要socket已建立连接, sendto 可用于无连接的 socket 对于send的有连接socket,两者一样,sendto最后两个参数没用.
  • sendto函数 和 recvfrom 函数一般用于UDP协议中,但是如果在 TCP 中 connect 函数调用后也可以用.
  • sendto() 和recvfrom() --------> 利用数据报文方式进行数据传输

28. 对端异常掉线,本端调用 write 函数向 socket 写入数据,会出现什么情况?
写操作返回异常,无法将数据写入到socket中

29. 用过正则表达式吗?写一个32位IP地址的正则
egrep "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" regex

30. ack为什么是syn+1而不是syn。直接传个syn回去让对端+1不行吗?
超时重传用。客户端发了 1 至 5 共 5 个包,但是 2 丢了。服务端在收到 3 时就会发现不符合预期,应该收到 2 的包结果收到了 3 ,这时就会发出 ack2 的包,表示希望收到 2 的数据。客户端在收到多次 ack2 的包就会启动快速重传重发服务端要求的 2 的数据。

31. OSI七层模型

  • 物理层:定义物理设备的标准。主要用于传输比特流
  • 数据链路层:定义了如何让格式化数据以帧为单位进行传输。主要作用:提供错误检测与纠正,确保数据的可靠传输
  • 网络层:位于不同位置的两台主机系统间提供连接和路径选择
  • 传输层:定义了一些传输数据的协议和端口号。
  • 会话层:主要在系统之间发起会话或接受会话请求
  • 表示层:确保一个系统应用层发出的数据
  • 应用层:为用户的应用程序提供网络服务
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP/IP协议是一种常用的网络通信协议栈,包含了多个层次的协议。其中包括网络接口层、网络层、传输层和应用层等。 网络接口层是TCP/IP协议栈中的最底层,负责处理数据在物理网络中的传输,包括数据链路层和物理层。在网络接口层,数据被封装成帧,通过网络接口卡(NIC)发送到目标主机。 网络层是TCP/IP协议栈的第二层,主要负责网络之间的通信,包括IP协议、ARP协议和路由协议等。IP协议是网络层的核心协议,它负责将数据包从源主机发送到目标主机。在发送数据包之前,IP会先检查Netfilter LOCAL_OUT钩子,根据配置执行iptables相关设置,然后执行IP路由,寻找下一跳的IP地址。 传输层是TCP/IP协议栈的第三层,提供可靠的端到端通信,主要包括TCP协议和UDP协议。TCP协议提供面向连接的可靠传输,通过三次握手建立连接,保证数据的可靠性和有序性。UDP协议则是一种无连接的传输协议,适用于一些对传输延迟要求较低的应用场景。 应用层是TCP/IP协议栈的最上层,包含各种应用协议,例如HTTP协议、FTP协议、SMTP协议等。应用层协议定义了数据的具体格式和传输规则,使不同的应用程序能够进行通信和数据交换。 总结起来,TCP/IP协议栈包括了网络接口层、网络层、传输层和应用层等多个层次的协议,通过这些协议实现了网络通信和数据传输。其中,网络接口层处理物理网络传输,网络层负责网络之间的通信和路由,传输层提供可靠的端到端通信,应用层定义了各种应用协议。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [计算机网络笔记、面试八股(一)—— TCP/IP网络模型](https://blog.csdn.net/weixin_41683971/article/details/129212811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [TCP/IP协议栈之数据包如何穿越各层协议(绝对干货)](https://blog.csdn.net/qq_40989769/article/details/129539739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值