본문 바로가기
WWDC

WWDC 18 - Introducing Network.framework: A modern alternative to Sockets

by vapor3965 2021. 6. 26.

목차


    • 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻

    https://developer.apple.com/videos/play/wwdc2018/715

     

    Introducing Network.framework: A modern alternative to Sockets - WWDC18 - Videos - Apple Developer

    The new Network.framework API gives you direct access to the same high-performance user-space networking stack used by URLSession. If...

    developer.apple.com

     

     



    관련내용

    • URLSesison에 기반하는 새로운 프레임워크 Network를배워보자.
    • Socket관련 라이브러리를 사용한다면 이 프레임워크와한번 비교해봐라.

    요약

    • 👍UDP, 라이브스트리밍(UDP+TCP), message(TCP) 에서 Network.framework로 소켓통신하자 ~
    • TCP를할경우 자동적으로 TCP 핸드쉐이킹을 해준다.
    • 와이파이만을 할지, 셀룰러를 할지 정할수있다.

     

     


    현대에는 Socket통신이어려운점이3가지있다.

     

    연결성확립.

    • host주소가필요하다.
      • 대부분 host이름으로가지고있으므로, host주소로변경하는 과정이필요하다
    • 다양한환경이도사린다?
      • 다양한환겨잉있으므로, 모든환경에테스트하기가어렵다

    데이타전달

    • read,write
    • TLS

    Mobility

    • 셀룰러, 네트워크,와이파이, VPN …
    • 사용자는이제는 다양한장소로옮겨가니까, 네트워크도계속변경된다.

     

     

    URLSession

    • URLSession은 많은문제들을해결해주낟.
    • 대부분 HTTP에집중하지만, StreamTask는 TLS,TCP와 직접적인연결에도 사용할수있다.

     

     

    URLSession은 상위Network프레임워크안에있다.
    하지만지금까지 앱은 URLSession에서만작용이가능했다.


    하지만,이제는 앱은 직접적으로 Network프레임워크와도 직접적으로사용할수잇게뙜다

     

     

     

     

    Network.framework

    • 소켓통신의어려움들을많이해결해준다.
    • 아주똑똑하게 연결확립을가진다.
    • TLS, DTLS을 지원한다.
    • 그리고네트워크변경도알려준다.

    아래와같이 low-level사용하는앱이
    적절한경우다

    게임앱은 대부분 UDP사용한다
    정말빠른응답을요하는 경우면

     

    라이브스트링앱 - UDP,TCP의결합
    버퍼링을최대한줄이는게목적

     

    mail, messaing 앱. TLS-TCP
    네트워크변경에도잘핸들링할수잇어야한다

     

     

     


    어떻게연결을성립할까?

    전통적인 소켓셋업은,
    DNSAPI이용해서 host주소받아오고,
    적절한host주소를선택해서 소켓만들고,
    소켓설정해준다.

    • nonblocking 같은.

     

     

    Network.framework 에서의 셋업은,

    👍연결을만든다.

    • 두가지를베이스로하는데,
    • destination을 정의하고,
      • host주소를 넣거나,
      • 또는 host이름과 port로 넣어라.
    • 파라미터를가진다.
      • 어떤 프로토콜을선택할지, - TLS,DTLS,UDP,TCp
      • 그리고, 어떤인터넷을할건지,only wifi인지,

    그리고? start()만 하면된다! 그냥기ㅏ딜면됨!

    예제

    • (정말간단하구려)
    • port에는 저렇게 swift식으로넣을수도있고, 숫자도넣을수있다.
    • 그다음 상태지정
      • ready는 read, write할수잇는단계,즉연결확립된단계
        • 👍만약 TLS프로토콜으랏용했다면, TLS핸드쉐이킹도끝난상태다.
      • wating은 말그대로, 기다리는상태,
        • 네트워크가좋지못해 다시waitng되는상태일수도있고, 이러한상황이라면 더좋은네트워크가될때가지 기다리면된다. 우리는 아무것도하지않아도된다.
      • failed 는 서버가끝났거나, TLS가안좋거나, 등 으로실패했을떄.
    • 그리고, start로, 원하는 큐를 같이넣어준다!


     

     

     

    👍Connection LifeCycle

     

    start()하게되면 연결홥립을시도한다.

    • TCP라면, TCP핸드쉐이킹을 해주고,
    • 가장빠른네트워크를선택해주고,

    Smart Connection Establishment

    • strat()하게되면, endpoint를 받아, 무엇이가능한지 해석한다.
    • 와이파이,셀룰러중에서, 와이파이를 주로선택한다
    • VPN있는지, 프록시가있는지확인한다
    • 그리고 다양한상황에 대해 병렬적으로 수행한다.빠르게다양한결과를얻기위해

    • 그리고만약 중간에 와이파이신호가갑자기 안좋아진다면, 셀룰러를선택할수있다.

     

    👍파라미터 더자세하게변경


    그리고물론, 모든가정들을 다확인하지않도록 할수도있다.
    와이파이만을 강제할수있다.

    또한 IPv6 만사용하도록할수도있다.!

    또한, proxi를사용하지않게할수도있다.

    그리고 연결이좋지않거나, 하면 계속 나대신 찾아주도록한다. - waiting

    ready단계에서는
    물론 네트워크변경이나 등등 콜백등을 받을수이싿.

    ready나, start단계에서바로 failed로갈수있다


    그리고 연결을다했다고생각하거나, 더이상필요없다라고할때,
    ready,waiting,start,failed에서 cancle을호출하여 cancle할수있다.

     

     

     



    실제앱에서 사용해보자

    라이브스트리밍

    • 지속적으로라이브비디오프레임을 보낼것이기때문에, UDP를사용하겠다

    우선, Capcutre session이 필요하다.

    • 이미지센서로부터 비디오프레임을받을수있다.

    그리고, 전달하기위해서는프레임들을 작은chunk로 분배해야한다.
    왜냐? UDP packet에 담아서보내야하기때문ㅇ

    물론! 연결을해야한다.
    그다음, 받는쪽은 리스너를 만들어야한다.


    그리고 보내온순서를 역순하여 보여지도록한다.


    그리고, 여기서는 카메라,화면들은 생략하고,
    아래부분들만 집중하겠다.

    리스너 만드는방법

    • 리스너를만들고, 리스너에 새로운연결이있다면 해당연결로 시작하는건가
      • 음, 새로운커넥션과 연결할수도있다…?

    UDPClient

    • 동영상을보내는

    UDPServer

    • 동영상을받는

     

     

    UDPClient

    • 이름으로 초기화받고, 이름으로 NWConnection을 만들고,

    • 그리고, ready가되면,
    • 우선 첫번째임시로 데이터를보내고, 보내는과정에잘못되면에러처리관한것도작성해주고,
    • 나에게ㅔ뭔가오면,receive하면, 그때부터 데이터를 보내주도록한다.

    그리고, 실제로 동영상 프레임을 보내는 것

    • 마찬가지로 헨들러에러를 작성한다.

     

     

    UDPServer

     

    봉주르서비스를이용하면 포트를작성안해도된다
    name을 초기하하지않는데, 그이유는 시스템이 이름을 알아서제공해주기를?


    만약 새로운커넥션이있다면?
    receive 함수를호출한다 ( 아래구현 )

    • 즉, 리스너와 연결된 클라이언트가 있다면! 그클라이언트와 연결한다는 뜻 !



    상태핸들링


    리스너 시작하고,

    receive하는 함수구현해준다.

    • 만약, 처음이라면, 커넥트되지않았다면, 임시데이터를보내줌으로써, 클라이언트가보내도록하게한다.
    • 그다음부터는 컨트롤러에화면나타나도록한다.
    • 👍receive 하고, 이상없으면 또 receive한다.

     

     

     

     

     


     

     

    Optimize Data Transfer

     

    send할때, .contentProcessed를 통해서, 더 효율적으로 ? 보낼수있다? 못보낼수있는상황도있다?


    ㄱ엄청많은 packet을 보낼경우, batch를이용해라?


    읽는경우

     

    전통적인 소켓이라면 10바이트정도읽을것이다.
    하지만, NWConnection은 최소,최대 읽을바이트를지정할수있다.


    🔥파라미터옵션 최적화

     

    ECN - Explicit Congestion Notification

    • 네트워크가혼잡할때 좋다?
    • TCP는 deafult다.
    • 하지만, UDP와 ECN은 어렵다?
      • 그래서, 따로 Metadata를만들고, 매번패킷마다 ECN을 마크하도록해준다 ?
      • 그리고 매번 send에 context를 넣어서보낸다.


    Service Class

    • 음, 네트워크상에서의 우선순위를정해준다?
    • background를하면 user interactive data 의속도로받아오지않는다?
    • UDP는 아까처럼 Medata에 표기한다.
      • Context에 ECN대신 Signaling?으로표기한다.


    TCP Fast Open
    음, TCP에서 사용하면 모든 핸드쉐이킹을기다리지않고 바로 데이터를보낸다?



    TLS에서…..


    DNS
    Server가 환경을잘안다면? 아래와같이 DNS최적화할수이따?


    User-Space Networking

    • 우리가아무것도하지않아도 장점을얻을수있는,

    이전의 구조는 이랬다.


    Uesr-space

    TCP,UDP단계들을 하나의단계로합쳐 올렸다?

    • 그럼이제 소켓은 계속 복사되어질필요가없다?

    이러한 장점이크다~

    • Netowrk프레임워크-소켓을사용하면이렇게나좋다.

     

     

     


    Resolve Network Mobility

    🔥Connection Viablity
    Viability
    BetterPathUpdate

     

    만약중간에 와이파이가 꺼졌다면,
    연결을종료하고, 사용자에게 연결이좋지않다라고해도되지만,
    연결을끊지않고,기다리며 와이파이가연ㄱㄹ되는걸 기다릴수있다.


    betterpathavaialbel을 키면, 와이파이꺼지면 셀룰러로 할수있도록해준다?


    두개다켜져있다면, 셀룰러모드였다가, 와이파이도가능하다면?
    와이파이로 갈아타게해준다.?


    Multiple TCP연결이가능하다?


    NWPathMonitor

    • 모든상황을보게해준다?

    하지말라는거

    각각선호되는것

    2018년까지는 UDP 멀티케스트르를 지원안해다

    댓글