인터넷을 통해 전달되는 데이터는 데이터그램(datagram)이라고 불리는 일정한 크기의 패킷으로 전송된다.
각각의 데이터그램은 헤더(header)와 페이로드(payload)를 포함하고 있다.
헤더에는 수신할 곳의 주소와 포트, 패킷을 송신한 곳의 주소와 포트, 데이터 손상을 탐지하기 위한 체크섬, 그 밖에 신뢰할 수 있는 전송을 위해 필요한 정보들이 포함되어있다.
페이로드에는 데이터 자체가 들어 있다.
그러나 데이터그램은 길이가 제한되어 있기 때문에, 종종 데이터를 다수의 패킷으로 분할하고 목적지에서 재조립할 필요가 있다.
그리고 또한 전송 중에 하나 이상의 패킷이 손실되거나 손상되어 재전송이 필요하거나, 패킷이 보낸 순서대로 도착하지 않을 경우 재정렬이 필요한 경우도 있다.
이러한 경우를 모두 처리하기 위해서는 많은 노력과 복잡한 코드가 필요하다.
(데이터를 패킷으로 나누기, 헤더 만들기, 수신 측에서 헤더 분석하기, 손실된 패킷 찾기 등등..)
이러한 일을 처리해 주는 것이 바로 소켓이다.
소켓은 프로그래머가 네트워크 연결을 바이트 단위로 읽고 쓰는 다른 스트림처럼 다룰 수 있도록 한다.
소켓은 에러 탐지, 패킷의 크기, 패킷 분할, 패킷 재전송, 네트워크 주소 등과 같은 네트워크 내부의 자세한 내용을 감싸 프로그래머가 신경쓰지 않도록 해준다.
'JAVA > 네트워크 프로그래밍' 카테고리의 다른 글
[JAVA] 소켓 생성과 연결(Client) (0) | 2016.09.05 |
---|---|
[JAVA] 소켓으로 서버에 쓰기(Client) (0) | 2016.09.03 |
[JAVA] 소켓으로 서버에서 읽기(Client) (0) | 2016.09.03 |
[JAVA] 소켓의 기능과 동작 (0) | 2016.09.03 |
[JAVA] 입출력 스트림(Input Output Stream) (3) | 2016.08.28 |