본문 바로가기
개발/통신

TCP/IP

by EPdev 2020. 5. 7.
728x90

채팅 기능을 구현하기 위해 TCP/IP를 공부하고 있다.

위키피디아(English ver.)을 기반으로 학습을 하고 있고,

중간중간 나오는 개념들 중에 이해가 가지 않는 부분들은 블로그 등을 참고하고 있다.

 

어차피 위키피디아에 다 나오는 것이라 내용을 그대로 적는 것은 별로 생산적이지 못 한것 같아서

내가 생각했을 때 TCP/IP의 중요한 특징들을 위주로 적고 부가적으로 내가 어떻게 이해했는지를 적겠다.

 

먼저 TCP는 Internet Protocol suite 중 주요 프로토콜 중 하나이다.

Internet Protocol(IP)를 보완한 초기 네트워크 구현에서 시작되었고 그래서 통상적으로 TCP/IP라고 불린다.

TCP 는 IP 네트워크에 연결된 호스트 통신으로 작동하는 앱들간에 옥텟(바이트)을 신뢰적이고, 순서적으로, 에러없이 전송되게 해준다.

WWW, 이메일, remote administration, 파일전송 등과 같은 주요 애플리케이션들이 TCP/IP suite의 Transport Layer(전송계층)의 한 파트인 TCP에 의존한다.

 

TCP는 연결 지향이다. 그래서 서버와 클라이언트 간 데이터를 보내기 전에 연결을 먼저 한다. 

여기서 Three-way handshake (3방향 악수) 가 나온다. 

3방향 악수는 Syn, Ack-Syn, Ack 등의 개념이 나온다. Syn = Synchronize sequence numbers), Ack = Acknowledgment 이다.

그러니까 클라이언트가 먼저 서버에 "나 전화할 준비 됐어! 번호는 이거야" 하면서 Syn 를 보낸다.

그럼 서버가 "오케이(Ack), 나도 준비됐어 번호는 여기(Syn)" 이렇게 보낸다.

그럼 다시 클라이언트가 "아 잘 받았어(Ack)" 이걸 서버로 다시 보낸다.

더보기

참고로 연결이 끊어질 때는 Four-way handshake가 일어나는데,

클라이언트가 "이만 통화 끝내자!(Fin)" 하면

서버가 "오케이(Ack) 잠깐만 기다려, 앱 종료할 준비 좀 하고!"를 보낸다.

서버측에서 앱 종료 준비가 되면

이번엔 서버측에서 "야 종료 준비 끝났어(Fin)"을 보내면

클라이언트가 "오케이 알았어(Ack)" 를 보낸다.

이렇게 종료됨.

다시 이어서..

TCP는 서버-클라이언트 연결 해놓고, 데이터를 보낼 때마다 확인을 받는다. 데이터가 잘 갔는지. 중간에 빠진건 없는지.

그래서 중간에 빠진게 있다거나 에러가 있으면, 그 데이터를 다시 보내준다.

이런 확인 절차 때문에 데이터의 누락이 없어 신뢰성은 확보되지만 상대적으로 속도가 느리다.

여기서 나오는게 UDP (User Datagram Protocol) 다.

UDP는 연결지향적이지 않다. TCP와 달리 UDP는 신뢰성보다 시간을 우선시한다. 그래서 "나는 일단 다 보낼테니까 받아봐" 이런 느낌으로 데이터를 전송한다. 이러한 특징 때문에, UDP는 중간에 데이터가 다소 손실이 되어도 문제가 없지만 속도가 중요한 VoIP(인터넷 전화), 스트리밍 등에 이용된다고 한다.

 

그리고 TCP에서 network congestion avoidence 라는 개념이 또 나온다.

network congestion 이란..

쉽게 판매자와 소비자 그리고 택배사의 관계로 알아보겠다.

판매자가 소비자가 구매한 물건을 택배로 보냈다. 근데 택배사에 이용자가 너무 많다보니까 소비자에게 택배가 가지 않고 있었다.

소비자가 택배를 잘 받았다고 응답해주기로 한 시간이 지나도 아무 말이 없길레 판매자는 택배가 안 간줄 알고 다시 보내주는 것이다.(이건 TCP의 특성)

근데 이 상황은 택배사에 물건이 많이 쌓여서 소비자들에게 못 보내주는 건데 판매자가 택배를 다시 보냈다고 해서 해결될 일이 아니다.

계속 중복되는 택배가 쌓이고 있는 것이다.

이를 해결하기 위해 판매자가 택배를 보낼 때 제대로 전달되는 양을 확인하는 것이다.

제대로 전달되면 그다음에는 좀더 많이 부쳐보고, 제대로 전달이 안되면 조금 줄여서 부쳐보고

이것이 network congestion 을 회피 avoidence 한다는 것

 

TCP 에 근데 약점이 있다.

denial of service, connection hijacking, TCP veto, reset attack 등이다. 세부 개념에 대해서는 다시 정리하기로 하고 대략적으로 보면 데이터가 중간에 가로채지고, 그동안 보냈던걸 초기화하는 공격 등 보안적인 약점인것 같다.

 

TCP는 여튼 복잡한 프로토콜이고 처음 나왔을 때와 크게 달라지지 않았다고 한다. 여전히 웹에서 광범위하게 사용되고 있다. HTTP, HTTP/2도 TCP 기반이라고 한다. (최신 표준인 HTTP/3 는 아님)

 

TCP 에 대해 더 자세한 내용이나 세그먼트 구조, 프로토콜 작동 등 많은 내용은 위키피디아를 참고해보자.

https://en.wikipedia.org/wiki/Transmission_Control_Protocol

 

 

추가 공부

internet protocol suite

OSI model

728x90

'개발 > 통신' 카테고리의 다른 글

InputStream, OutputStream  (0) 2020.05.17
소켓(Socket)  (0) 2020.05.13

댓글