...
본문 바로가기

WWDC

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


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

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 멀티케스트르를 지원안해다