day2 课堂笔记 网络编程

今日内容大纲

  1. 端口协议:TCP协议、UDP协议。
  2. TCP协议三次握手和四次挥手
  3. TCP协议的补充
  4. 什么是socket

具体内容

1. 端口协议:TCP协议、UDP协议

  • UDP协议

    ​ UDP是user datagram protocol的简称,中文名是用户数据包协议,他是不可靠的无线连接协议,面向数据包,相对不安全,但它的传输效率高,尽最大努力服务,无阻塞控制。

    ​ “包头” 部分一共只有8个字节,总长度不超过65535字节,正好放进一个IP数据包。

以太网头IP头UDP头data
  • TCP协议

    ​ TCP协议是transmission control protocol的简称,中文名是传输控制协议,他是可靠的面向连接的流式协议。相对安全,但是传输效率相对低,一般用于文件传输,发送或者接收邮件,远程登录等等。

    ​ 可靠传输,TCP数据没有长度限制,理论上可以无限长,但是为了保证网络效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。总长度也是不超过65535字节。

以太网头IP头TCP头data
IP数据包就是一个抽象概念,是对数据包的结构进行分析,由首部和数据两部分组成,总长度不超过65535个字节。IP头 + TCP头 + data = 65535个字节

TCP报文

img

2. TCP的三次握手和四次挥手

  • 三次握手

    ​ 比如客户端与服务端基于TCP协议这种面向连接的网络通信,通过OSI七层模型的层层封装,然后广播、在通过ARP协议获取Mac地址,经由路由协议终于找到了计算结B对应的软件上,这就好比唐僧师徒四人经历九九八十一终于取得真经一样,如果每次通信都是这么艰辛,不仅效率低,而且各个硬件设备处理的事物重复繁琐,产生的内耗是巨大的。所以如果让我们去设计网络通信的方式应该怎么去做?

    ​ 比如,如果回到没有导航的年代,我想跑保定到济南的运输线,你怎么做?第一次的时候,你应该参考纸质版地图,经过路标等提示信息、沿路地询问最终到达济南。那么下一次再从保定到济南,你还用这么麻烦吗?最优路线你已经记住了,下一次你就直接按照上一次走的路线送货就可以了。

    ​ 所以,我们网络通信也是基于这个原理,当客户端与服务端第一次建立链接时,他现有建立最优路线的专属通道,通道建立完成后,我们的客户端想要给服务端发送消息了,直接将数据向管道一丢,数据就会顺着管道传输到服务端上,非常快速方便。同理,服务端想要与客户端回消息,也一定要先建立最优路线的专属管道,消息顺着管道就会快速的到达客户端,这样省去了每次发送数据不必要的操作,重复的工作,提高了效率。

  • ​ 所谓三次握手,是指建立一个TCP连接时,需要客户端和服务器总共发送三个包、三次握手的目的是连接服务器指定的端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息,在socket编程中,客户端执行connect()时。将触发三次握手。

    • 第一次握手:
      客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

img

  • 第二次握手:
    服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。

    • 第三次握手.
      客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1

    image

  • 四次挥手

    ​ TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器金可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

(1)数据传输结束后,通信的双方都可以释放连接。现在A和B都处于ESTABLISHED状态。

  (2)A的应用程序先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的FIN置1,其序号seq=u,它等于前面已经传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。(请注意:TCP规定,FIN报文段即使不携带数据,它也要消耗一个序号)。

  (3)B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已经传送过的数据的最后一个序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭。这个状态可能会持续一些时间。

  (4)A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

  (5)若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入了LAST-ACK(最后确认)状态,等待A的确认。

  A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态(请注意:现在TCP连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL(MSL:最长报文段寿命)后,A才进入到CLOSED状态)。

相关面试题

  • 为什么TCP断开链接需要四次挥手?

    ​ 客户端给服务器说要断开连接,客户端已经不需要给服务端发送数据,但是此时你不能确定服务端给客户端发送的数据是否完毕,所以不能合成一次挥手,只有等服务端给客户端发送的数据全部发送完毕后,服务端在发送断开管道的请求。

  • 如果已经建立了连接,但是客户端突然出现故障了怎么办?

    ​ cp设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,拜拜浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常设置为两个小时,若两个小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  • 什么是SYN洪水攻击?

    ​ TCP协议也称为“好人”协议,什么叫好人?因为TCP协议不会拒绝任何客户端的链接,只要有客户端来链接我,我就给他回一个ACK然后向客户端发送SYN请求,等待客户端同意,在客户端没有同意之前,服务器会维护一个未连接队列,该队列为每个客户端的SYN包(SYN=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户端发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包是,删除该条目,服务器进入ESTABLISHED状态。

    ​ SYN洪水攻击:利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源,配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断发送SYN包,服务短期恢复确认包,并等待客户的确认,由于原地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络阻塞设置系统瘫痪。

3. 什么事socket?

五层通信流程:

​ 但实际上从网络传输层开始以及以下,都是操作系统以及各个硬件设备帮咱们完成的,下面的各种包头封装的过程,用咱们去一个个做吗?闲的!

img

​ socket又称为套接字,他是应用层与TCP/IP协议族通信的中间软件抽象层,他是一组接口。在设计模式中,socket其实就是一个门面模式,他把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。当我们使用不同的协议进行通信时就得少用不同的接口,还得处理不同协议的各种细节,这就增加了开发难度,软件也不易于扩展,于是Unix BSD就发明了socket这种东西,socket屏蔽了各个协议的通信细节,使得程序员无需关注写一本身,直接使用socket提供的接口来进行互联的不同主机见得进程的通信。这就好比操作系统给我们提供了使用底层硬件功能的调用,通过系统调用我们可以方便的使用磁盘,使用内存,而无需自己进行磁盘的读写,内存管理。socket其实也是一样的东西,就是提供了TCP/IP协议的抽象,对外提供了一套接口,通过这个接口就可以统一、方便的使用TCP/IP协议的功能了。

​ 其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。 所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。

​ 套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

小结:

  • Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。socket就是一组简单的接口,将原本要与底层硬件和操作系统相关联的复杂的功能逻辑给你封装成一个个简单的接口(类似于函数的调用)直接使用。
    族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。socket就是一组简单的接口,将原本要与底层硬件和操作系统相关联的复杂的功能逻辑给你封装成一个个简单的接口(类似于函数的调用)直接使用。
  • socket就是一个模块,通过模块的一些简单方法去使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值