[Fix] Network 서비스에서 사용할 NWParameter 옵션 변경 #153
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🌁 Background
리뷰 노트 참고
👩💻 Contents
📝 Review Note
기존에는 NWParameter에서 클래스 변수로 제공하는 tcp를 이용하여 네트워크 서비스를 구축했습니다. 하지만 아래와 같은 문제로 tcp옵션을 커스텀해야 할 필요성을 느꼈습니다.
NWParameter.tcp의 connectionTimeout 시간은 기본적으로 0으로 설정되어 있습니다.
이 connectionTimeout은 TCP가 establish하여 connection을 연결하는데 걸리는 시간을 제한합니다.
한 가지 유의할 점은, 이 connectionTimeout이 0이면 연결 대기를 제한된 시간동안 진행하는 것이 아닌 무기한 대기한다는 점입니다. 따라서 저희는 임의로 5초로 설정하였습니다. (범용적으로 많이 사용하는 connectionTime시간에 대해서는 잘 알지 못해서.. 적절한 설정값이 있으면 추후 수정하겠습니다.)
실기기를 이용한 테스트 중 종종 앱을 강제 종료하면 상대방 기기에서 연결이 정상적으로 끊어지지 않는 문제가 있었습니다.
TCP는 연결 기반의 전송 계층 프로토콜입니다. 따라서 연결을 끊을 때도 handshake를 통해 연결을 종료하게 되는데요, 이 연결을 끊기 위한 handshake가 정상적으로 동작하지 않아 위와 같은 문제가 일어나는 것이라 추측했습니다. (패킷 로스 또는 handshake가 정상적 수행 안됨).
이를 해결하기 위해 Keep-Alive가 필요했습니다. Keep-Alive는 장시간 연결이 유휴 상태일 때도 연결을 유지(persistence connection을 유지)하기 위한 옵션입니다. Keep-Alive의 간단한 동작 방식은 아래와 같습니다.
NWParameter.tcp는 기본적으로 Keep-Alive 기능이 꺼져있어서 커스텀 NWProtocolTCP의 option에서 해당 기능을 enable하게 수정했습니다.