본문 바로가기
  • 시 쓰는 개발자
CS 개념/네트워크

TCP / UDP

by poetDeveloper 2022. 10. 21.

TCP/UDP를 알아야 하는 이유?

웹 어플리케이션의 신뢰성과 성능 개선을 하는 중요한 역할을 한다.

EX. DB와 서버간의 통신을 할 때 데이터의 소실 방지, 순서 보장

 

TCP/IP 모델

  • Application Layer – HTTP, 브라우저라고 생각하면 됨
  • Transport Layer – TCP, UDP
  • Internet Layer - IP
  • Network Access Layer - 이더넷

 

TCP 헤더 종류

컨트롤 비트  
SYN 송신측과 수신측에서 시퀀스 번호를 공유함을 나타냄
ACK 수신 데이터의 시퀀스 번호가 유효함을 나타냄
FIN 연결 끊기를 나타냄
시퀀스 번호 현재 데이터의 첫 번째 위치가 전체 송신 데이터에 몇 번째 위치인지를 나타내는 일련번호
ACK 번호 수신측에서 몇 바이트까지 받았는지 송신측으로 보내는 일련번호

 

TCP 동작 과정

소켓 생성 → ②연결을 위한 3 way handshake 진행 → ③데이터 송수신 → ④연결을 끊기 위한 4 way handshake 진행

 

소켓 생성

브라우저에서 소켓을 호출하는데, 이때 도메인과 사용할 타입(TCP)를 사용해서 호출.

이때 OS의 네트워크 제어용 소프트웨어격인 프로토콜 스택이 이를 받아서 소켓 작성, 디스크립터(소켓의 번호표 같은 느낌)를 반환해줌.

 

연결을 위한 3 way handshake 진행

브라우저가 위에 1번에서 받은 디스크립터와, 요청을 보낸 서버 IP주소, 포트번호를 넣어서 호출. 프로토콜 스택이 이 요청을 받아서 웹 서버로 요청을 보냄.

자세히 말하면)

- 클라이언트에서 시퀀스 번호를 초기화. 초기화한 번호를 공유하기 위해 SYN을 설정해서 서버로 보내줌.

서버도 시퀀스 번호를 초기화 해서 공유하고, 아까 받은 시퀀스 번호를 잘 받았다고 알려주기 위해 아크번호를 설정해서 클라이언트로 데이터를 보냄.

 

데이터 송수신

클라이언트에서 write()를 호출. 브라우저에서 받은 HTTP Request 메시지를 받아서 패킷으로 만들어 서버로 전달. 이걸 받은 서버는 응답하기 위해 데이터와 패킷 만들어서 클라이언트로 보내고 클라이언트는 read()를 호출해서 데이터를 읽게 됨.

만약 중간에 패킷이 소실돼서 일정시간동안 클라이언트에게 응답이 오지 않으면 이전 패킷을 재전송 해서 요청하는데, 이랬는데도 요청이 안오면 데이터 송신 작업을 강제종료하고 어플리케이션에 오류를 반환함.

 

연결을 끊기 위한 4 way handshake 진행

클라이언트가 close()를 호출하면 연결끊기를 나타내는 컨트롤 비트 FIN을 설정해서 서버로 보냄. 서버는 FIN에 대한 응답으로 ACK를 설정해서 보내줌. 이때 클라이언트는 서버로부터 FIN응답이 올때까지 기다리는 상태가 됨.

 

만약 서버에서 보낼 데이터가 없다면 close()를 호출해서 FIN 데이터를 클라이언트로 보내게 됨.

 

클라이언트가 잘 받았으면 잘 받았다는 의미로 ACK번호를 설정해서 서버로 보내면 클라이언트의 소켓이 말소되고 연결이 끊기게 됨. 바로 말소되는건 아니고 일정 시간이 지난 뒤에 말소되는데, 그 이유는 서버가 ACK패킷을 받지 못했을 경우에 다시 요청할 수도 있어서 일정 시간이 지난 뒤에 말소됨.

 

UDP 동작 과정

TCP와 동일하게 소켓을 호출하는데 이때 도메인과, 사용할 타입(UDP)를 설정해서 호출하게 됨. 그럼 마찬가지로 프로토콜 스택이 소켓을 작성하고 디스크립터를 반환해줌.

 

클라이언트에서 sendto()를 호출하고 브라우저로부터 받은 HTTP 메시지를 넣어서 패킷으로 만들어 서버로 전송하게 됨. 서버에서는 이것에 대한 응답을 하기 위해 sendto()를 호출하게 되고 이때 패킷이 소실되더라도 다음 데이터를 바로 전송하게 됨. 클라이언트는 이걸 신경쓰지 않고 recvfrom()을 호출해서 데이터를 5byte 받게 됨.

 

TCP와는 달리 UDP에는 handshake 과정이 없음.

 

정리

TCP는 패킷의 소실을 방지하고 패킷의 순서를 보장하기 위해 아크번호와 시퀀스 번호를 사용해서 신뢰성이 높지만 UDP는 이런 것들을 사용하지 않기 때문에 신뢰성이 낮다.

  TCP UDP
신뢰성 높음 낮음
전송속도 handshake를 하기 때문에 느림 handshake 과정이 없어서 빠름
사용되는 곳 HTTP 2.0 이하의 버전 대부분 DNS, 동영상, 음성데이터

 

느낀점

아직 네트워크를 공부 안해서 그런가 생각보다 어려웠고, 잘 이해가 되지 않았다. 포괄적인 느낌만 가져갔고 나중에 네트워크 공부를 하면서 다시 공부해봐야겠다.