- 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻
https://developer.apple.com/videos/play/wwdc2018/715
관련내용
- 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가안좋거나, 등 으로실패했을떄.
- ready는 read, write할수잇는단계,즉연결확립된단계
- 그리고, 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 멀티케스트르를 지원안해다
'WWDC' 카테고리의 다른 글
WWDC 16 - What's New in UICollectionView in iOS 10 (0) | 2021.06.26 |
---|---|
WWDC 19 - Advance in App Background Execution (0) | 2021.06.26 |
WWDC 19 - Advances in Networking, Part 1 (0) | 2021.06.24 |
WWDC 17 - Advances in Networking, Part 2 (0) | 2021.06.24 |
WWDC 15 - Networking with NSURLSession (0) | 2021.06.24 |