Alamofire - 4.8.2&三次握手&四次挥手

2019-08-18  本文已影响0人  Janek_m

学习-设计思路
介绍 Alamofire属于纯网络层,提供了链式的request/response方法,JSON的传参和响应序列化,身份认证和其他特性。优雅之处在于它完完全全是由Swift写成的,并且没有从它的Objective-C版本-AFNetworking那继承任何特性。

URLSessionConfiguration初始化模式
        //初始化一个后台的模式的会话配置
        let configuration = URLSessionConfiguration.background(withIdentifier: self.createID())
        // 初始化session会话
        let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
        // 传入url开启下载
        session.downloadTask(with: url).resume()

        // 创建了一个session会话
        // dataTask -> url
        // resume
        // 以上是可以进行监听 ---
        // 数据回来 - 代理

//MARK: - session代理

extension ViewController:URLSessionDownloadDelegate{
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        // 下载完成 - 开始沙盒迁移
        print("下载完成 - \(location)")
        let locationPath = location.path
        //拷贝到用户目录(文件名以时间戳命名)
        let documnets = NSHomeDirectory() + "/Documents/" + self.lgCurrentDataTurnString() + ".mp4"
        print("移动地址:\(documnets)")
        //创建文件管理器
        let fileManager = FileManager.default
        try! fileManager.moveItem(atPath: locationPath, toPath: documnets)

    }
    
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        print(" bytesWritten \(bytesWritten)\n totalBytesWritten \(totalBytesWritten)\n totalBytesExpectedToWrite \(totalBytesExpectedToWrite)")
        print("下载进度: \(Double(totalBytesWritten)/Double(totalBytesExpectedToWrite))\n")
    }
    
    // 回调系统回调,告诉系统及时更新屏幕
    func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
        print("后台任务下载回来")
        DispatchQueue.main.async {
            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundSessionCompletionHandler else { return }
            backgroundHandle()
        }
    }
}

//  MARK:易错易忽略点
// 开启后台下载权限
    func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
        self.backgroundSessionCompletionHandler = completionHandler
    }

网络重点

符号的概念:

三次握⼿

  • 第一次握手: 客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号seq=x,此时,客户端进程进入了SYN-SENT状态,等待服务器的确认。
  • 第二次握手: 服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该ACK=1SYN=1,确认号是ack=x+1,同时也要为自己随机初始化一个序列号seq=y,此时,服务器进程进入了SYN-RCVD状态,询问客户端是否做好准备。
  • 第三次握手: 客户端进程收到确认后,还要向服务器给出确认。确认报文的ACK=1ack=y+1,此时,连接建立,客户端进入ESTABLISHED状态,服务器端也进入ESTABLISHED状态。
偷了个懒-自己没有去画图

四次挥手

  • 第一次挥手: 客户端进程发出连接释放FIN报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=x,此时,客户端进入FIN-WAIT-1(终止等待1)状态。
  • 第二次挥手: 服务端进程收到连接释放FIN报文,发出确认ACK报文,ACK=1ack=x+1,并且带上自己的序列号seq=y,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。此时,服务端通知高层的应用进程,客户端向服务端的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务端若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务端的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,在这之前依然可以接收服务端发送过来的最后的数据。
  • 第三次挥手: 服务端将最后的数据发送给客户端完成后,就向客户端发送连接释放FIN报文,FIN=1ack=x+1,此时的序列号为seq=z,此时,服务端就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  • 第四次挥手: 客户端接收到服务端的连接释放FIN报文后,必须发出确认报文,ACK=1ack=z+1,而自己的序列号是seq=x+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。此时服务端收到客户端发送过来的确认报文,就立即撤销自己的传输控制块TCB,进入CLOSED状态,注意此时的TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,客户端没有收到服务端发来的任何数据,证明服务端已正常关闭,此时客户端会撤销相应传输控制块TCB后,进入CLOSED状态。至此,TCP的连接才真正的断开了。(服务端结束TCP连接的时间要比客户端稍微早一些)
偷了个懒-自己没有去画图

面试题(记录大神提供)

OSI七层网络协议

上三层【应用层、表示层、会话层】
物理层【应用层、传输层、网络层、数据链路层】

参考

上一篇下一篇

猜你喜欢

热点阅读